From b4b0c7e72d7eaee2fbfc7022022c9698323203dd Mon Sep 17 00:00:00 2001 From: ivan Date: Thu, 31 Dec 2009 13:16:41 +0000 Subject: import rt 3.8.7 --- rt/share/html/Search/Build.html | 323 +++++++++++++++ rt/share/html/Search/Bulk.html | 446 +++++++++++++++++++++ rt/share/html/Search/Chart | 186 +++++++++ rt/share/html/Search/Chart.html | 98 +++++ rt/share/html/Search/Edit.html | 99 +++++ rt/share/html/Search/Elements/BuildFormatString | 250 ++++++++++++ rt/share/html/Search/Elements/Chart | 147 +++++++ rt/share/html/Search/Elements/ConditionRow | 97 +++++ rt/share/html/Search/Elements/DisplayOptions | 134 +++++++ rt/share/html/Search/Elements/EditFormat | 113 ++++++ rt/share/html/Search/Elements/EditQuery | 243 +++++++++++ rt/share/html/Search/Elements/EditSearches | 296 ++++++++++++++ rt/share/html/Search/Elements/Graph | 50 +++ rt/share/html/Search/Elements/NewListActions | 66 +++ rt/share/html/Search/Elements/PickBasics | 214 ++++++++++ rt/share/html/Search/Elements/PickCFs | 104 +++++ rt/share/html/Search/Elements/PickCriteria | 72 ++++ rt/share/html/Search/Elements/ResultViews | 80 ++++ rt/share/html/Search/Elements/SearchPrivacy | 55 +++ rt/share/html/Search/Elements/SearchesForObject | 65 +++ rt/share/html/Search/Elements/SelectAndOr | 53 +++ rt/share/html/Search/Elements/SelectChartType | 58 +++ rt/share/html/Search/Elements/SelectGroup | 67 ++++ rt/share/html/Search/Elements/SelectGroupBy | 63 +++ rt/share/html/Search/Elements/SelectLinks | 66 +++ rt/share/html/Search/Elements/SelectPersonType | 84 ++++ rt/share/html/Search/Elements/SelectSearchObject | 68 ++++ .../html/Search/Elements/SelectSearchesForObjects | 69 ++++ rt/share/html/Search/Graph.html | 50 +++ rt/share/html/Search/Results.html | 201 ++++++++++ rt/share/html/Search/Results.rdf | 103 +++++ rt/share/html/Search/Results.tsv | 162 ++++++++ rt/share/html/Search/Simple.html | 106 +++++ 33 files changed, 4288 insertions(+) create mode 100644 rt/share/html/Search/Build.html create mode 100755 rt/share/html/Search/Bulk.html create mode 100644 rt/share/html/Search/Chart create mode 100644 rt/share/html/Search/Chart.html create mode 100755 rt/share/html/Search/Edit.html create mode 100644 rt/share/html/Search/Elements/BuildFormatString create mode 100644 rt/share/html/Search/Elements/Chart create mode 100644 rt/share/html/Search/Elements/ConditionRow create mode 100644 rt/share/html/Search/Elements/DisplayOptions create mode 100644 rt/share/html/Search/Elements/EditFormat create mode 100644 rt/share/html/Search/Elements/EditQuery create mode 100644 rt/share/html/Search/Elements/EditSearches create mode 100644 rt/share/html/Search/Elements/Graph create mode 100644 rt/share/html/Search/Elements/NewListActions create mode 100644 rt/share/html/Search/Elements/PickBasics create mode 100644 rt/share/html/Search/Elements/PickCFs create mode 100644 rt/share/html/Search/Elements/PickCriteria create mode 100644 rt/share/html/Search/Elements/ResultViews create mode 100644 rt/share/html/Search/Elements/SearchPrivacy create mode 100644 rt/share/html/Search/Elements/SearchesForObject create mode 100644 rt/share/html/Search/Elements/SelectAndOr create mode 100644 rt/share/html/Search/Elements/SelectChartType create mode 100644 rt/share/html/Search/Elements/SelectGroup create mode 100644 rt/share/html/Search/Elements/SelectGroupBy create mode 100644 rt/share/html/Search/Elements/SelectLinks create mode 100644 rt/share/html/Search/Elements/SelectPersonType create mode 100644 rt/share/html/Search/Elements/SelectSearchObject create mode 100644 rt/share/html/Search/Elements/SelectSearchesForObjects create mode 100644 rt/share/html/Search/Graph.html create mode 100755 rt/share/html/Search/Results.html create mode 100644 rt/share/html/Search/Results.rdf create mode 100644 rt/share/html/Search/Results.tsv create mode 100644 rt/share/html/Search/Simple.html (limited to 'rt/share/html/Search') diff --git a/rt/share/html/Search/Build.html b/rt/share/html/Search/Build.html new file mode 100644 index 000000000..0fd79742a --- /dev/null +++ b/rt/share/html/Search/Build.html @@ -0,0 +1,323 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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 }}} +%# +%# Data flow here: +%# The page receives a Query from the previous page, and maybe arguments +%# corresponding to actions. (If it doesn't get a Query argument, it pulls +%# one out of the session hash. Also, it could be getting just a raw query from +%# Build/Edit.html (Advanced).) +%# +%# After doing some stuff with default arguments and saved searches, the ParseQuery +%# function (which is similar to, but not the same as, _parser in RT/Tickets_Overlay_SQL) +%# converts the Query into a RT::Interface::Web::QueryBuilder::Tree. This mason file +%# then adds stuff to or modifies the tree based on the actions that had been requested +%# by clicking buttons. It then calls GetQueryAndOptionList on the tree to generate +%# the SQL query (which is saved as a hidden input) and the option list for the Clauses +%# box in the top right corner. +%# +%# Worthwhile refactoring: the tree manipulation code for the actions could use some cleaning +%# up. The node-adding code is different in the "add" actions from in ParseQuery, which leads +%# to things like ParseQuery correctly not quoting numbers in numerical fields, while the "add" +%# action does quote it (this breaks SQLite). +%# +<& /Elements/Header, Title => $title &> +<& /Ticket/Elements/Tabs, + current_tab => "Search/Build.html?".$QueryString, + Title => $title, + %query, + SavedSearchId => $saved_search{'Id'}, + SavedChartSearchId => $ARGS{SavedChartSearchId}, +&> + +
+ + + + + + + + +
+ <& Elements/PickCriteria, query => $query{'Query'}, cfqueues => $queues &> +
+<& /Elements/Submit, Label => loc('Add these terms'), Name => 'AddClause'&> +<& /Elements/Submit, Label => loc('Add these terms and Search'), Name => 'DoSearch'&> + + +
+<& Elements/EditQuery, + %ARGS, + actions => \@actions, + optionlist => $optionlist, + Description => $saved_search{'Description'}, + &> +
+
+ <& Elements/EditSearches, %saved_search, CurrentSearch => \%query &> +
+ + +<& Elements/DisplayOptions, + %ARGS, %query, + AvailableColumns => $AvailableColumns, + CurrentFormat => $CurrentFormat, +&> +<& /Elements/Submit, Label => loc('Update format and Search'), Name => 'DoSearch', id=>"formatbuttons"&> + +
+ +<%INIT> +use RT::Interface::Web::QueryBuilder; +use RT::Interface::Web::QueryBuilder::Tree; + +$ARGS{SavedChartSearchId} ||= 'new'; + +my $title = loc("Query Builder"); + +my %query; +for( qw(Query Format OrderBy Order RowsPerPage) ) { + $query{$_} = $ARGS{$_}; +} + +my %saved_search; +my @actions = $m->comp( 'Elements/EditSearches:Init', %ARGS, Query => \%query, SavedSearch => \%saved_search); + +if ( $NewQuery ) { + + # Wipe all data-carrying variables clear if we want a new + # search, or we're deleting an old one.. + %query = (); + %saved_search = ( Id => 'new' ); + + # ..then wipe the session out.. + delete $session{'CurrentSearchHash'}; + + # ..and the search results. + $session{'tickets'}->CleanSlate if defined $session{'tickets'}; +} + +{ # Attempt to load what we can from the session and preferences, set defaults + + my $current = $session{'CurrentSearchHash'}; + my $prefs = $session{'CurrentUser'}->UserObj->Preferences("SearchDisplay") || {}; + my $default = { Query => '', Format => '', OrderBy => 'id', Order => 'ASC', RowsPerPage => 50 }; + + for( qw(Query Format OrderBy Order RowsPerPage) ) { + $query{$_} = $current->{$_} unless defined $query{$_}; + $query{$_} = $prefs->{$_} unless defined $query{$_}; + $query{$_} = $default->{$_} unless defined $query{$_}; + } + + for( qw(Order OrderBy) ) { + if (ref $query{$_} eq "ARRAY") { + $query{$_} = join( '|', @{ $query{$_} } ); + } + } + if ( $query{'Format'} ) { + # Clean unwanted junk from the format + $query{'Format'} = $m->comp( '/Elements/ScrubHTML', Content => $query{'Format'} ); + } +} + +my $ParseQuery = sub { + my ($string, $results) = @_; + + my $tree = RT::Interface::Web::QueryBuilder::Tree->new('AND'); + @$results = $tree->ParseSQL( Query => $string, CurrentUser => $session{'CurrentUser'} ); + + return $tree; +}; + +my @parse_results; +my $tree = $ParseQuery->( $query{'Query'}, \@parse_results ); + +# if parsing went poorly, send them to the edit page to fix it +if ( @parse_results ) { + return $m->comp( "Edit.html", Query => $query{'Query'}, actions => \@actions ); +} + +my @options = $tree->GetDisplayedNodes; +my @current_values = grep defined, @options[@clauses]; +my @new_values = (); + +# {{{ Try to find if we're adding a clause +foreach my $arg ( keys %ARGS ) { + next unless $arg =~ m/^ValueOf(\w+|'CF.{.*?}')$/ + && ( ref $ARGS{$arg} eq "ARRAY" + ? grep $_ ne '', @{ $ARGS{$arg} } + : $ARGS{$arg} ne '' ); + + # We're adding a $1 clause + my $field = $1; + + my ($op, $value); + + #figure out if it's a grouping + my $keyword = $ARGS{ $field . "Field" } || $field; + + my ( @ops, @values ); + if ( ref $ARGS{ 'ValueOf' . $field } eq "ARRAY" ) { + # we have many keys/values to iterate over, because there is + # more than one CF with the same name. + @ops = @{ $ARGS{ $field . 'Op' } }; + @values = @{ $ARGS{ 'ValueOf' . $field } }; + } + else { + @ops = ( $ARGS{ $field . 'Op' } ); + @values = ( $ARGS{ 'ValueOf' . $field } ); + } + $RT::Logger->error("Bad Parameters passed into Query Builder") + unless @ops == @values; + + for ( my $i = 0; $i < @ops; $i++ ) { + my ( $op, $value ) = ( $ops[$i], $values[$i] ); + next if !defined $value || $value eq ''; + + if ( $value eq 'NULL' && $op =~ /=/ ) { + if ( $op eq '=' ) { + $op = "IS"; + } + elsif ( $op eq '!=' ) { + $op = "IS NOT"; + } + + # This isn't "right", but... + # It has to be this way until #5182 is fixed + $value = "'NULL'"; + } + else { + $value =~ s/'/\\'/g; + $value = "'$value'" unless $value =~ /^\d+$/; + } + + my $clause = { + Key => $keyword, + Op => $op, + Value => $value + }; + + push @new_values, RT::Interface::Web::QueryBuilder::Tree->new($clause); + } +} + +# }}} + +push @actions, $m->comp('Elements/EditQuery:Process', + %ARGS, + Tree => $tree, + Selected => \@current_values, + New => \@new_values, +); + +# {{{ Rebuild $Query based on the additions / movements + +my $optionlist_arrayref; +($query{'Query'}, $optionlist_arrayref) = $tree->GetQueryAndOptionList(\@current_values); + +my $optionlist = join "\n", map { qq() } @$optionlist_arrayref; + +# }}} + +my $queues = $tree->GetReferencedQueues; + +# {{{ Deal with format changes +my ( $AvailableColumns, $CurrentFormat ); +( $query{'Format'}, $AvailableColumns, $CurrentFormat ) = $m->comp( + 'Elements/BuildFormatString', + %ARGS, + cfqueues => $queues, + Format => $query{'Format'}, +); + +# }}} + +# if we're asked to save the current search, save it +push @actions, $m->comp( 'Elements/EditSearches:Save', %ARGS, Query => \%query, SavedSearch => \%saved_search); + +# {{{ Push the updates into the session so we don't loose 'em + +$session{'CurrentSearchHash'} = { + %query, + SearchId => $saved_search{'Id'}, + Object => $saved_search{'Object'}, + Description => $saved_search{'Description'}, +}; + +# }}} + +# {{{ Show the results, if we were asked. + +if ( $ARGS{'DoSearch'} ) { + $m->comp( 'Results.html', %query, SavedChartSearchId => $ARGS{'SavedChartSearchId'}, ); + $m->comp( '/Elements/Footer' ); + $m->abort; +} + +# }}} + +# {{{ Build a querystring for the tabs + +my $QueryString = ''; +if ($NewQuery) { + $QueryString = 'NewQuery=1'; +} +elsif ( $query{'Query'} ) { + $QueryString = $m->comp('/Elements/QueryString', %query ); +} + +# }}} + + + +<%ARGS> +$NewQuery => 0 +@clauses => () + diff --git a/rt/share/html/Search/Bulk.html b/rt/share/html/Search/Bulk.html new file mode 100755 index 000000000..fa20e331c --- /dev/null +++ b/rt/share/html/Search/Bulk.html @@ -0,0 +1,446 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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 }}} +<& /Elements/Header, Title => $title &> +<& /Ticket/Elements/Tabs, + current_tab => "Search/Bulk.html", + Title => $title, + Format => $ARGS{'Format'}, # we don't want the locally modified one + Query => $Query, + Rows => $Rows, + OrderBy => $OrderBy, + Order => $Order, + SavedSearchId => $SavedSearchId, + SavedChartSearchId => $SavedChartSearchId, + &> + +<& /Elements/ListActions, actions => \@results &> +
+% foreach my $var qw(Query Format OrderBy Order Rows Page SavedChartSearchId) { + +%} +<& /Elements/CollectionList, + Query => $Query, + DisplayFormat => $Format, + Format => $ARGS{'Format'}, + Verbatim => 1, + AllowSorting => 1, + OrderBy => $OrderBy, + Order => $Order, + Rows => $Rows, + Page => $Page, + BaseURL => RT->Config->Get('WebPath')."/Search/Bulk.html?", + Class => 'RT::Tickets' + &> + +% $m->callback(CallbackName => 'AfterTicketList', ARGSRef => \%ARGS); + +
+ +<& /Elements/Submit, Label => loc('Update'), CheckAll => 1, ClearAll => 1 &> +
+<&|/Widgets/TitleBox, title => $title &> + + + + + +
+ + + + + + + + + + + + + + + +
<&|/l&>Make Owner: <& /Elements/SelectOwner, Name => "Owner" &> ( <&|/l&>Force change)
<&|/l&>Add Requestor:
<&|/l&>Remove Requestor:
<&|/l&>Add Cc:
<&|/l&>Remove Cc:
<&|/l&>Add AdminCc:
<&|/l&>Remove AdminCc:
+
+ + + + + + + + + + + + + + + + + + + +
<&|/l&>Make subject:
<&|/l&>Make priority: <& /Elements/SelectPriority, Name => "Priority" &>
<&|/l&>Make queue: <& /Elements/SelectQueue, Name => "Queue" &>
<&|/l&>Make Status: <& /Elements/SelectStatus, Name => "Status" &>
<&|/l&>Make date Starts: <& /Elements/SelectDate, Name => "Starts_Date", ShowTime => 0, Default => '' &>
<&|/l&>Make date Started: <& /Elements/SelectDate, Name => "Started_Date", ShowTime => 0, Default => '' &>
<&|/l&>Make date Told: <& /Elements/SelectDate, Name => "Told_Date", ShowTime => 0, Default => '' &>
<&|/l&>Make date Due: <& /Elements/SelectDate, Name => "Due_Date", ShowTime => 0, Default => '' &>
<&|/l&>Make date Resolved: <& /Elements/SelectDate, Name => "Resolved_Date", ShowTime => 0, Default => '' &>
+ +
+ +<&| /Widgets/TitleBox, title => loc('Add comments or replies to selected tickets') &> + + + + +% while (my $CF = $TxnCFs->Next()) { + + + + +% } # end if while +% if (exists $session{'Attachments'}) { + + + +% } # end of if + + + +
<&|/l&>Update Type: +
<&|/l&>Subject:
<% $CF->Name %>:<& /Elements/EditCustomField, + CustomField => $CF, + NamePrefix => "Object-RT::Transaction--CustomField-" + &><% $CF->FriendlyType %>
<&|/l&>Attached file: +<&|/l&>Check box to delete
+% foreach my $attach_name (keys %{$session{'Attachments'}}) { +<%$attach_name%>
+% } # end of foreach +
<&|/l&>Attach: + +
<&|/l&>Message: + <& /Elements/MessageBox, Name=>"UpdateContent"&> +
+ + + +<%perl> +my $cfs = RT::CustomFields->new($session{'CurrentUser'}); +$cfs->LimitToGlobal(); +$cfs->LimitToQueue($_) for keys %$seen_queues; + + +% if ($cfs->Count) { +<&|/Widgets/TitleBox, title => loc('Edit Custom Fields'), color => "#336633"&> + + + + + + +% while (my $cf = $cfs->Next()) { + + +% my $rows = 5; +% my @add = (NamePrefix => 'Bulk-Add-CustomField-', CustomField => $cf, Rows => $rows, Multiple => ($cf->MaxValues ==1 ? 0 : 1) , Cols => 25); +% my @del = (NamePrefix => 'Bulk-Delete-CustomField-', CustomField => $cf, Rows => $rows, Multiple => 1, Cols => 25); +% if ($cf->Type eq 'Select') { + + +% } elsif ($cf->Type eq 'Combobox') { + + +% } elsif ($cf->Type eq 'Freeform') { + + +% } elsif ($cf->Type eq 'Text') { + + +% } else { +% $RT::Logger->crit("Unknown CustomField type: " . $cf->Type); +% } + +% } +
<&|/l&>Name<&|/l&>Add values<&|/l&>Delete values
<% loc($cf->Name) %>
+(<%$cf->FriendlyType%>)
<& /Elements/EditCustomFieldSelect, @add &><& /Elements/EditCustomFieldSelect, @del &><& /Elements/EditCustomFieldCombobox, @add &><& /Elements/EditCustomFieldCombobox, @del &><& /Elements/EditCustomFieldFreeform, @add &><& /Elements/EditCustomFieldFreeform, @del &><& /Elements/EditCustomFieldText, @add &> 
+ +% } + +<&|/Widgets/TitleBox, title => loc('Edit Links'), color => "#336633"&> +<&|/l&>Enter tickets or URIs to link tickets to. Separate multiple entries with spaces.
+<& /Ticket/Elements/BulkLinks, Tickets => $Tickets &> + + +<& /Elements/Submit, Label => loc('Update') &> + + +
+ + +<%INIT> +unless ( defined $Rows ) { + $Rows = $RowsPerPage; + $ARGS{Rows} = $RowsPerPage; +} +my $title = loc("Update multiple tickets"); + +# Iterate through the ARGS hash and remove anything with a null value. +map ( $ARGS{$_} =~ /^$/ && ( delete $ARGS{$_} ), keys %ARGS ); + +my (@results); + +# {{{ deal with deleting uploaded attachments +foreach my $key (keys %ARGS) { + if ($key =~ m/^DeleteAttach-(.+)$/) { + delete $session{'Attachments'}{$1}; + } + $session{'Attachments'} = { %{$session{'Attachments'} || {}} }; +} +# }}} + +# {{{ store the uploaded attachment in session +if ($ARGS{'Attach'}) { # attachment? + my $attachment = MakeMIMEEntity( + AttachmentFieldName => 'Attach' + ); + + my $file_path = Encode::decode_utf8("$ARGS{'Attach'}"); + $session{'Attachments'} = { + %{$session{'Attachments'} || {}}, + $file_path => $attachment, + }; +} +# }}} + +# delete temporary storage entry to make WebUI clean +unless (keys %{$session{'Attachments'}} and $ARGS{'UpdateAttach'}) { + delete $session{'Attachments'}; +} +# }}} + +$Page ||= 1; + +$Format ||= RT->Config->Get('DefaultSearchResultFormat'); + +# inject _CHECKBOX to the first field. +$Format =~ s/'?([^']+)'?,/'___CHECKBOX__$1',/; + +my $Tickets = RT::Tickets->new( $session{'CurrentUser'} ); +$Tickets->FromSQL($Query); +if ( $OrderBy =~ /\|/ ) { + + # Multiple Sorts + my @OrderBy = split /\|/, $OrderBy; + my @Order = split /\|/, $Order; + $Tickets->OrderByCols( + map { { FIELD => $OrderBy[$_], ORDER => $Order[$_] } } + ( 0 .. $#OrderBy ) ); +} +else { + $Tickets->OrderBy( FIELD => $OrderBy, ORDER => $Order ); +} + +$Tickets->RowsPerPage($Rows) if ($Rows); +$Tickets->GotoPage( $Page - 1 ); # SB uses page 0 as the first page + +Abort( loc("No search to operate on.") ) unless ($Tickets); + +# build up a list of all custom fields for tickets that we're displaying, so +# we can display sane edit widgets. + +my $fields = {}; +my $seen_queues = {}; +while ( my $ticket = $Tickets->Next ) { + next if $seen_queues->{ $ticket->Queue }++; + + my $custom_fields = $ticket->CustomFields; + while ( my $field = $custom_fields->Next ) { + $fields->{ $field->id } = $field; + } +} + +#Iterate through each ticket we've been handed +my @linkresults; +my %queues; + +$Tickets->RedoSearch(); + +# pull out the labels for any custom fields we want to update + +my $cf_del_keys; +@$cf_del_keys = grep { /^Bulk-Delete-CustomField/ } keys %ARGS; +my $cf_add_keys; +@$cf_add_keys = grep { /^Bulk-Add-CustomField/ } keys %ARGS; + +unless ( $ARGS{'AddMoreAttach'} ) { + # Add session attachments if any to be processed by ProcessUpdateMessage + $ARGS{'UpdateAttachments'} = $session{'Attachments'} if ( $session{'Attachments'} ); + + while ( my $Ticket = $Tickets->Next ) { + next unless ( $ARGS{ "UpdateTicket" . $Ticket->Id } ); + + #Update the links + $ARGS{'id'} = $Ticket->id; + $queues{ $Ticket->QueueObj->Id }++; + + my @updateresults = ProcessUpdateMessage( + TicketObj => $Ticket, + ARGSRef => \%ARGS, + ); + + #Update the basics. + my @basicresults = + ProcessTicketBasics( TicketObj => $Ticket, ARGSRef => \%ARGS ); + my @dateresults = + ProcessTicketDates( TicketObj => $Ticket, ARGSRef => \%ARGS ); + + #Update the watchers + my @watchresults = + ProcessTicketWatchers( TicketObj => $Ticket, ARGSRef => \%ARGS ); + + foreach my $type qw(MergeInto DependsOn MemberOf RefersTo) { + $ARGS{ $Ticket->id . "-" . $type } = $ARGS{"Ticket-$type"}; + $ARGS{ $type . "-" . $Ticket->id } = $ARGS{"$type-Ticket"}; + } + @linkresults = + ProcessTicketLinks( TicketObj => $Ticket, ARGSRef => \%ARGS ); + foreach my $type qw(MergeInto DependsOn MemberOf RefersTo) { + delete $ARGS{ $type . "-" . $Ticket->id }; + delete $ARGS{ $Ticket->id . "-" . $type }; + } + + my @cfresults; + + foreach my $list ( $cf_add_keys, $cf_del_keys ) { + next unless $list->[0]; + + + my $op; + if ( $list->[0] =~ /Add/ ) { + $op = 'add'; + + } + elsif ( $list->[0] =~ /Del/ ) { + $op = 'del'; + } + else { + $RT::Logger->crit( + "Got an op that was neither add nor delete. can never happen" + . $list->[0] ); + last; + } + + foreach my $key (@$list) { + my ( $cfid, $cf ); + next if $key =~ /CustomField-(\d+)-Category$/; + if ( $key =~ /CustomField-(\d+)-/ ) { + $cfid = $1; + $cf = RT::CustomField->new( $session{'CurrentUser'} ); + $cf->Load($cfid); + } + else {next} + my @values = + ref( $ARGS{$key} ) eq 'ARRAY' + ? @{ $ARGS{$key} } + : ( $ARGS{$key} ); + map { s/(\r\n|\r)/\n/g; } @values; # fix the newlines + # now break the multiline values into multivalues + @values = map { split( /\n/, $_ ) } @values + unless ( $cf->SingleValue ); + + my $current_values = $Ticket->CustomFieldValues($cfid); + foreach my $value (@values) { + if ( $op eq 'del' && $current_values->HasEntry($value) ) { + my ( $id, $msg ) = $Ticket->DeleteCustomFieldValue( + Field => $cfid, + Value => $value + ); + push @cfresults, $msg; + } + + elsif ( $op eq 'add' && !$current_values->HasEntry($value) ) { + my ( $id, $msg ) = $Ticket->AddCustomFieldValue( + Field => $cfid, + Value => $value + ); + push @cfresults, $msg; + } + } + } + } + my @tempresults = ( + @watchresults, @basicresults, @dateresults, + @updateresults, @linkresults, @cfresults + ); + + @tempresults = + map { loc( "Ticket [_1]: [_2]", $Ticket->Id, $_ ) } @tempresults; + + @results = ( @results, @tempresults ); + } + + # Cleanup WebUI + delete $session{'Attachments'}; +} + +my $TxnCFs = RT::CustomFields->new( $session{CurrentUser} ); +$TxnCFs->LimitToLookupType( RT::Transaction->CustomFieldLookupType ); +$TxnCFs->LimitToGlobalOrObjectId( sort keys %queues ); + + +<%args> +$Format => undef +$Page => 1 +$Rows => undef +$RowsPerPage => undef +$Order => 'ASC' +$OrderBy => 'id' +$Query => undef +$SavedSearchId => undef +$SavedChartSearchId => undef + diff --git a/rt/share/html/Search/Chart b/rt/share/html/Search/Chart new file mode 100644 index 000000000..59e9fc6fc --- /dev/null +++ b/rt/share/html/Search/Chart @@ -0,0 +1,186 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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> +$Query => "id > 0" +$PrimaryGroupBy => 'Queue' +$SecondaryGroupBy => undef +$ChartStyle => 'bars' + +<%init> +my $chart_class; +use GD; +use GD::Text; + +if ($ChartStyle eq 'pie') { + require GD::Graph::pie; + $chart_class = "GD::Graph::pie"; +} else { + require GD::Graph::bars; + $chart_class = "GD::Graph::bars"; +} + +use RT::Report::Tickets; +my $tix = RT::Report::Tickets->new( $session{'CurrentUser'} ); +my ($count_name, $value_name) = $tix->SetupGroupings( + Query => $Query, GroupBy => $PrimaryGroupBy, +); + +my $chart = $chart_class->new( 600 => 400 ); + +my $font = RT->Config->Get('ChartFont') || ['verdana', 'arial', gdMediumBoldFont]; +$chart->set_title_font( $font, 12 ) if $chart->can('set_title_font'); +$chart->set_legend_font( $font, 12 ) if $chart->can('set_legend_font'); +$chart->set_x_label_font( $font, 10 ) if $chart->can('set_x_label_font'); +$chart->set_y_label_font( $font, 10 ) if $chart->can('set_y_label_font'); +$chart->set_label_font( $font, 10 ) if $chart->can('set_label_font'); +$chart->set_x_axis_font( $font, 9 ) if $chart->can('set_x_axis_font'); +$chart->set_y_axis_font( $font, 9 ) if $chart->can('set_y_axis_font'); +$chart->set_values_font( $font, 9 ) if $chart->can('set_values_font'); +$chart->set_value_font( $font, 9 ) if $chart->can('set_value_font'); + +# Pie charts don't like having no input, so we show a special image +# that indicates an error message. Because this is used in an +# context, it can't be a simple error message. Without this check, +# the chart will just be a non-loading image. +if ($tix->Count == 0) { + my $plot = GD::Image->new(600 => 400); + $plot->colorAllocate(255, 255, 255); # background + my $black = $plot->colorAllocate(0, 0, 0); + + require GD::Text::Wrap; + my $error = GD::Text::Wrap->new($plot, + color => $black, + text => loc("No tickets found."), + ); + $error->set_font( $font, 12 ); + $error->draw(0, 0); + + $m->comp( 'SELF:Plot', plot => $plot, %ARGS ); +} + +if ($chart_class eq "GD::Graph::bars") { + $chart->set( + x_label => $tix->Label( $PrimaryGroupBy ), + x_labels_vertical => 1, + y_label => loc('Tickets'), + show_values => 1 + ); +} + +my %class = ( + Queue => 'RT::Queue', + Owner => 'RT::User', + Creator => 'RT::User', + LastUpdatedBy => 'RT::User', +); +my $class = $class{ $PrimaryGroupBy }; + +my %data; +while ( my $entry = $tix->Next ) { + my $key; + if ( $class ) { + my $q = $class->new( $session{'CurrentUser'} ); + $q->Load( $entry->__Value( $value_name ) ); + $key = $q->Name; + } + else { + $key = $entry->__Value($value_name); + } + $key ||= '(no value)'; + + my $value = $entry->__Value( $count_name ); + if ($chart_class eq 'GD::Graph::pie') { + $key = loc($key) ." - ". $value; + } else { + $key = loc($key); + } + $data{ $key } = $value; +} + +# XXX: Convert 1970-01-01 date to the 'Not Set' +# this code should be generalized!!! +if ( $PrimaryGroupBy =~ /(Daily|Monthly|Annually)$/ ) { + my $re; + $re = qr{1970-01-01} if $PrimaryGroupBy =~ /Daily$/; + $re = qr{1970-01} if $PrimaryGroupBy =~ /Monthly$/; + $re = qr{1970} if $PrimaryGroupBy =~ /Annually$/; + foreach my $k (keys %data) { + my $tmp = $k; + $tmp =~ s/^$re/loc('Not Set')/e or next; + $data{$tmp} = delete $data{$k}; + } +} + +unless (keys %data) { + $data{''} = 0; +} + +my $plot = $chart->plot( [ [sort keys %data], [map $data{$_}, sort keys %data] ] ) or die $chart->error; +$m->comp( 'SELF:Plot', plot => $plot, %ARGS ); + + +<%METHOD Plot> +<%ARGS> +$plot => undef + +<%INIT> +my @types = ('png', 'gif'); + +for my $type (@types) { + $plot->can($type) + or next; + + $r->content_type("image/$type"); + $m->out( $plot->$type ); + $m->abort(); +} + +die "Your GD library appears to support none of the following image types: " . join(', ', @types); + + + diff --git a/rt/share/html/Search/Chart.html b/rt/share/html/Search/Chart.html new file mode 100644 index 000000000..fb9f45c66 --- /dev/null +++ b/rt/share/html/Search/Chart.html @@ -0,0 +1,98 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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> +$PrimaryGroupBy => 'Queue' +$SecondaryGroupBy => '' +$ChartStyle => 'bars' +$Description => undef + +<%init> +$ARGS{SecondaryGroupBy} ||= ''; +$ARGS{Query} ||= 'id > 0'; + +# FIXME: should be factored with RT::Report::Tickets::Label :( +my $PrimaryGroupByLabel; +if ( $PrimaryGroupBy =~ /^(?:CF|CustomField)\.{(.*)}$/ ) { + my $cf = $1; + if ( $cf =~ /\D/ ) { + $PrimaryGroupByLabel = loc( "custom field '[_1]'", $cf ); + } else { + my $obj = RT::CustomField->new( $session{'CurrentUser'} ); + $obj->Load( $cf ); + $PrimaryGroupByLabel = loc( "custom field '[_1]'", $obj->Name ); + } +} else { + $PrimaryGroupByLabel = loc( $PrimaryGroupBy ); +} + +my $title = loc( "Search results grouped by [_1]", $PrimaryGroupByLabel ); + +my $saved_search = $m->comp( '/Widgets/SavedSearch:new', + SearchType => 'Chart', + SearchFields => [qw(Query PrimaryGroupBy SecondaryGroupBy ChartStyle)] ); + +my @actions = $m->comp( '/Widgets/SavedSearch:process', args => \%ARGS, self => $saved_search ); + + +<& /Elements/Header, Title => $title &> +<& /Ticket/Elements/Tabs, Title => $title, Query => $ARGS{Query}, + SavedChartSearchId => $saved_search->{SearchId} &> +<& /Elements/ListActions, actions => \@actions &> +<& /Search/Elements/Chart, %ARGS &> + +
+<&| /Widgets/TitleBox, title => loc('Graph Properties')&> +
+ + +<&|/l, $m->scomp('Elements/SelectChartType', Name => 'ChartStyle', Default => $ChartStyle), $m->scomp('Elements/SelectGroupBy', Name => 'PrimaryGroupBy', Query => $ARGS{Query}, Default => $PrimaryGroupBy) +&>[_1] chart by [_2] +
+ + +<& /Widgets/SavedSearch:show, %ARGS, Action => 'Chart.html', self => $saved_search, Title => loc('Saved charts') &> diff --git a/rt/share/html/Search/Edit.html b/rt/share/html/Search/Edit.html new file mode 100755 index 000000000..e3e2da29a --- /dev/null +++ b/rt/share/html/Search/Edit.html @@ -0,0 +1,99 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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 }}} +<& /Elements/Header, Title => $title&> +<& /Ticket/Elements/Tabs, + current_tab => "Search/Edit.html?".$QueryString, + Title => $title, + Format => $Format, + Query => $Query, + Rows => $Rows, + OrderBy => $OrderBy, + Order => $Order, + SavedSearchId => $SavedSearchId, + SavedChartSearchId => $SavedChartSearchId, +&> + +<& Elements/NewListActions, actions => \@actions &> + +
+ + +<&|/Widgets/TitleBox, title => loc('Query'), &> + + +<&|/Widgets/TitleBox, title => loc('Format'), &> + + +<& /Elements/Submit, Label => loc("Apply"), Reset => 1, Caption => loc("Apply your changes")&> +
+ +<%INIT> +my $title = loc("Edit Query"); +$Format = $m->comp('/Elements/ScrubHTML', Content => $Format); +my $QueryString = $m->comp('/Elements/QueryString', + Query => $Query, + Format => $Format, + RowsPerPage => $Rows, + OrderBy => $OrderBy, + Order => $Order, + ); + + + + +<%ARGS> +$SavedSearchId => 'new' +$SavedChartSearchId => 'new' +$Query => '' +$Format => '' +$Rows => '50' +$OrderBy => 'id' +$Order => 'ASC' + +@actions => () + diff --git a/rt/share/html/Search/Elements/BuildFormatString b/rt/share/html/Search/Elements/BuildFormatString new file mode 100644 index 000000000..972851160 --- /dev/null +++ b/rt/share/html/Search/Elements/BuildFormatString @@ -0,0 +1,250 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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> +$Format => RT->Config->Get('DefaultSearchResultFormat') + +%cfqueues => () + +$Face => undef +$Size => undef +$Link => undef +$Title => undef + +$AddCol => undef +$RemoveCol => undef +$ColUp => undef +$ColDown => undef + +$SelectDisplayColumns => undef +$CurrentDisplayColumns => undef + +<%init> +# This can't be in a block, because otherwise we return the +# same \@fields every request, and keep tacking more CustomFields onto +# it -- and it grows per request. + +# All the things we can display in the format string by default +my @fields = qw( + id QueueName Subject + Status ExtendedStatus UpdateStatus + Type + + OwnerName Requestors Cc AdminCc CreatedBy LastUpdatedBy + + Priority InitialPriority FinalPriority + + TimeWorked TimeLeft TimeEstimated + + Starts StartsRelative + Started StartedRelative + Created CreatedRelative + LastUpdated LastUpdatedRelative + Told ToldRelative + Due DueRelative + Resolved ResolvedRelative + + RefersTo ReferredToBy + DependsOn DependedOnBy + MemberOf Members + Parents Children + + Bookmark + + NEWLINE +); # loc_qw + +$m->callback( CallbackOnce => 1, CallbackName => 'SetFieldsOnce', Fields => \@fields ); + +my $CustomFields = RT::CustomFields->new( $session{'CurrentUser'}); +foreach my $id (keys %cfqueues) { + # Gotta load up the $queue object, since queues get stored by name now. my $id + my $queue = RT::Queue->new($session{'CurrentUser'}); + $queue->Load($id); + unless ($queue->id) { + # XXX TODO: This ancient code dates from a former developer + # we have no idea what it means or why cfqueues are so encoded. + $id =~ s/^.'*(.*).'*$/$1/; + $queue->Load($id); + } + $CustomFields->LimitToQueue($queue->Id); +} +$CustomFields->LimitToGlobal; + +while ( my $CustomField = $CustomFields->Next ) { + push @fields, "CustomField.{" . $CustomField->Name . "}"; +} + +$m->callback( Fields => \@fields, ARGSRef => \%ARGS ); + +my ( @seen); + +$Format ||= RT->Config->Get('DefaultSearchResultFormat'); +my @format = split( /,\s*/, $Format ); +foreach my $field (@format) { + my %column = (); + $field =~ s/'(.*)'/$1/; + my ( $prefix, $suffix ); + if ( $field =~ m/(.*)__(.*)__(.*)/ ) { + $prefix = $1; + $suffix = $3; + $field = $2; + } + $field = "" if !$field; + $column{Prefix} = $prefix; + $column{Suffix} = $suffix; + $field =~ s/\s*(.*)\s*/$1/; + $column{Column} = $field; + push @seen, \%column; +} + +if ( $RemoveCol ) { + # we do this regex match to avoid a non-numeric warning + my ($index) = $CurrentDisplayColumns =~ /^(\d+)/; + my $column = $seen[$index]; + if ($index) { + delete $seen[$index]; + my @temp = @seen; + @seen = (); + foreach my $element (@temp) { + next unless $element; + push @seen, $element; + } + } +} +elsif ( $AddCol ) { + if ( defined $SelectDisplayColumns ) { + my $selected = $SelectDisplayColumns; + my @columns; + if (ref($selected) eq 'ARRAY') { + @columns = @$selected; + } else { + push @columns, $selected; + } + foreach my $col (@columns) { + my %column = (); + $column{Column} = $col; + + if ( $Face eq "Bold" ) { + $column{Prefix} .= ""; + $column{Suffix} .= ""; + } + if ( $Face eq "Italic" ) { + $column{Prefix} .= ""; + $column{Suffix} .= ""; + } + if ($Size) { + $column{Prefix} .= "<" . $m->interp->apply_escapes( $Size, 'h' ) . ">"; + $column{Suffix} .= "interp->apply_escapes( $Size, 'h' ) . ">"; + } + if ( $Link eq "Display" ) { + $column{Prefix} .= q{}; + $column{Suffix} .= ""; + } + elsif ( $Link eq "Take" ) { + $column{Prefix} .= q{}; + $column{Suffix} .= ""; + } + elsif ( $Link eq "Respond" ) { + $column{Prefix} .= q{}; + $column{Suffix} .= ""; + } + elsif ( $Link eq "Comment" ) { + $column{Prefix} .= q{}; + $column{Suffix} .= ""; + } + elsif ( $Link eq "Resolve" ) { + $column{Prefix} .= q{}; + $column{Suffix} .= ""; + } + + if ($Title) { + $column{Suffix} .= "/TITLE:" . $m->interp->apply_escapes( $Title, 'h' ); + } + push @seen, \%column; + } + } +} +elsif ( $ColUp ) { + my $index = $CurrentDisplayColumns; + if ( defined $index && ( $index - 1 ) >= 0 ) { + my $column = $seen[$index]; + $seen[$index] = $seen[ $index - 1 ]; + $seen[ $index - 1 ] = $column; + $CurrentDisplayColumns = $index - 1; + } +} +elsif ( $ColDown ) { + my $index = $CurrentDisplayColumns; + if ( defined $index && ( $index + 1 ) < scalar @seen ) { + my $column = $seen[$index]; + $seen[$index] = $seen[ $index + 1 ]; + $seen[ $index + 1 ] = $column; + $CurrentDisplayColumns = $index + 1; + } +} + + +my @format_string; +foreach my $field (@seen) { + next unless $field; + my $row = "'"; + $row .= $field->{'Prefix'} if defined $field->{'Prefix'}; + $row .= "__" . ($field->{'Column'} =~ m/\(/ ? $field->{'Column'} # func, don't escape + : $m->interp->apply_escapes( $field->{'Column'}, 'h' )) . "__" + unless ( $field->{'Column'} eq "" ); + $row .= $field->{'Suffix'} if defined $field->{'Suffix'}; + $row .= "'"; + push( @format_string, $row ); +} + +$Format = join(",\n", @format_string); + + +return($Format, \@fields, \@seen); + + diff --git a/rt/share/html/Search/Elements/Chart b/rt/share/html/Search/Elements/Chart new file mode 100644 index 000000000..3db92c4d8 --- /dev/null +++ b/rt/share/html/Search/Elements/Chart @@ -0,0 +1,147 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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> +$Query => "id > 0" +$PrimaryGroupBy => 'Queue' +$SecondaryGroupBy => undef +$ChartStyle => 'bars' + +<%init> +use RT::Report::Tickets; +$PrimaryGroupBy ||= 'Queue'; # make sure PrimaryGroupBy is not undef + +my $tix = RT::Report::Tickets->new( $session{'CurrentUser'} ); +my ($count_name, $value_name) = $tix->SetupGroupings( + Query => $Query, GroupBy => $PrimaryGroupBy, +); + +my %class = ( + Queue => 'RT::Queue', + Owner => 'RT::User', + Creator => 'RT::User', + LastUpdatedBy => 'RT::User', +); +my $class = $class{ $PrimaryGroupBy }; + +my (@keys, @values); +while ( my $entry = $tix->Next ) { + if ($class) { + my $q = $class->new( $session{'CurrentUser'} ); + $q->Load( $entry->__Value( $value_name ) ); + push @keys, $q->Name; + } + else { + push @keys, $entry->__Value( $value_name ); + } + $keys[-1] ||= loc('(no value)'); + push @values, $entry->__Value( $count_name ); +} + +# XXX: Convert 1970-01-01 date to the 'Not Set' +# this code should be generalized!!! +if ( $PrimaryGroupBy =~ /(Daily|Monthly|Annually)$/ ) { + my $re; + $re = qr{1970-01-01} if $PrimaryGroupBy =~ /Daily$/; + $re = qr{1970-01} if $PrimaryGroupBy =~ /Monthly$/; + $re = qr{1970} if $PrimaryGroupBy =~ /Annually$/; + foreach (@keys) { + s/^$re/loc('Not Set')/e; + } +} + +my %data; +my %loc_keys; +foreach my $key (@keys) { $data{$key} = shift @values; $loc_keys{$key} = loc($key); } +my @sorted_keys = map { $loc_keys{$_}} sort { $loc_keys{$a} cmp $loc_keys{$b} } keys %loc_keys; +my @sorted_values = map { $data{$_}} sort { $loc_keys{$a} cmp $loc_keys{$b} } keys %loc_keys; + + +my $query_string = $m->comp('/Elements/QueryString', %ARGS); + + +<% loc('Query:') %> <% $Query %>
+ +% if (RT->Config->Get('DisableGD')) { +<% loc('Graphical charts are not available.') %>
+% } else { +
+% } + + + + + + +% my ($i,$total); +% while (my $key = shift @sorted_keys) { +% $i++; +% my $value = shift @sorted_values; +% $total += $value; + + + + +% } + +%$i++; + + + + + +
<% loc($tix->Label($PrimaryGroupBy)) %> +<&|/l&>Tickets +
+<%$key%> + +<%$value%> +
+<%loc('Total')%> + +<%$total||''%> +
diff --git a/rt/share/html/Search/Elements/ConditionRow b/rt/share/html/Search/Elements/ConditionRow new file mode 100644 index 000000000..d45c6621b --- /dev/null +++ b/rt/share/html/Search/Elements/ConditionRow @@ -0,0 +1,97 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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 }}} + +<% $handle_block->( $Condition->{'Field'}, $Condition->{'Name'} .'Field' ) |n %> +<% $handle_block->( $Condition->{'Op'}, $Condition->{'Name'} .'Op') |n %> +<% $handle_block->( $Condition->{'Value'}, 'ValueOf'. $Condition->{'Name'} ) |n %> + +<%INIT> +return unless $Condition && $Condition->{'Name'}; + +$m->callback( Condition => \$Condition ); +return unless $Condition; + +my $handle_block; +$handle_block = sub { + my $box = shift; + return $box unless ref $box; + + my $name = shift; + if ( UNIVERSAL::isa($box, 'ARRAY') ) { + my $res = ''; + $res .= $handle_block->( $_, $name ) foreach @$box; + return $res; + } + + return undef unless UNIVERSAL::isa($box, 'HASH'); + if ( $box->{'Type'} eq 'component' ) { + $box->{'Arguments'} ||= {}, + return $m->scomp( $box->{'Path'}, %{ $box->{'Arguments'} }, Name => $name ); + } + if ( $box->{'Type'} eq 'text' ) { + my $default = $box->{'Default'} || ''; + my $size = $box->{'Size'}? qq{size="$box->{'Size'}"} : ''; + return qq{}; + } + if ( $box->{'Type'} eq 'select' ) { + my $res = ''; + $res .= qq{}; + return $res; + } +}; + + +<%ARGS> +$Condition => {} + diff --git a/rt/share/html/Search/Elements/DisplayOptions b/rt/share/html/Search/Elements/DisplayOptions new file mode 100644 index 000000000..40d976cfd --- /dev/null +++ b/rt/share/html/Search/Elements/DisplayOptions @@ -0,0 +1,134 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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 }}} +<&| /Widgets/TitleBox, title => loc("Sorting"), id => 'sorting' &> + + +% for my $o (0..3) { +% $Order[$o] ||= ''; $OrderBy[$o] ||= ''; + + + + +% } + + + +
+% if ($o == 0) { +<&|/l&>Order by: +% } + + + +
+<&|/l&>Rows per page: + +<& /Elements/SelectResultsPerPage, + Name => "RowsPerPage", + Default => $RowsPerPage &> +
+ +<&| /Widgets/TitleBox, title => loc("Display Columns"), id => 'columns' &> +<& EditFormat, %ARGS &> + + +<%INIT> +my $tickets = new RT::Tickets($session{'CurrentUser'}); +my %fields = %{$tickets->FIELDS}; +map { $fields{$_}->[0] =~ /^(?:ENUM|INT|DATE|STRING|ID)$/ || delete $fields{$_} } keys %fields; +delete $fields{'EffectiveId'}; +$fields{'Owner'} = 1; +$fields{ $_ . '.EmailAddress' } = 1 foreach( qw(Requestor Cc AdminCc) ); + +# Add all available CustomFields to the list of sortable columns. +my @cfs = grep /^CustomField/, @{$ARGS{AvailableColumns}}; +$fields{$_}=1 for @cfs; + +# Add PAW sort +$fields{'Custom.Ownership'} = 1; + +my @Order = split /\|/, $Order; +my @OrderBy = split /\|/, $OrderBy; +if ($Order =~ /\|/) { + @Order = split /\|/, $Order; +} else { + @Order = ( $Order ); +} + + + +<%ARGS> +$Order => undef +$OrderBy => undef +$RowsPerPage => undef +$Format => undef +$GroupBy => 'id' + diff --git a/rt/share/html/Search/Elements/EditFormat b/rt/share/html/Search/Elements/EditFormat new file mode 100644 index 000000000..9dd616039 --- /dev/null +++ b/rt/share/html/Search/Elements/EditFormat @@ -0,0 +1,113 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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 }}} + + + + + + + + + + + + + + + + + + + + +
<&|/l&>Add Columns:<&|/l&>Format:<&|/l&>Show Columns:
<&|/l&>Link: + +
<&|/l&>Title: +
<&|/l&>Size: + +
<&|/l&>Style: + +
+ +
+
+ + + +
+
+ +<%ARGS> +$CurrentFormat => undef +$AvailableColumns => undef + diff --git a/rt/share/html/Search/Elements/EditQuery b/rt/share/html/Search/Elements/EditQuery new file mode 100644 index 000000000..9a10ddff6 --- /dev/null +++ b/rt/share/html/Search/Elements/EditQuery @@ -0,0 +1,243 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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 }}} +<& NewListActions, actions => $actions &> +<&|/Widgets/TitleBox, title => join(': ', grep defined, loc("Current search"), $Description) &> + + + +

+ + + + + + +%# +

+ + +<%ARGS> +$Description => undef +$optionlist => '' +$actions => [] + + +<%METHOD Process> +<%ARGS> +$Tree +$Selected +@New => () + +<%INIT> + +my @NewSelection = (); + +my @results; +if ( $ARGS{'Up'} || $ARGS{'Down'} ) { + if (@$Selected) { + foreach my $value (@$Selected) { + my $parent = $value->getParent; + my $index = $value->getIndex; + my $newindex = $index; + $newindex++ if $ARGS{'Down'}; + $newindex-- if $ARGS{'Up'}; + if ( $newindex < 0 || $newindex >= $parent->getChildCount ) { + push( @results, [ loc("error: can't move up"), -1 ] ) if $ARGS{'Up'}; + push( @results, [ loc("error: can't move down"), -1 ] ) if $ARGS{'Down'}; + next; + } + + $parent->removeChild( $index ); + $parent->insertChild( $newindex, $value ); + } + } + else { + push( @results, [ loc("error: nothing to move"), -1 ] ); + } +} +elsif ( $ARGS{"Left"} ) { + if (@$Selected) { + foreach my $value (@$Selected) { + my $parent = $value->getParent; + if( $value->isRoot || $parent->isRoot ) { + push( @results, [ loc("error: can't move left"), -1 ] ); + next; + } + + my $grandparent = $parent->getParent; + if( $grandparent->isRoot ) { + push( @results, [ loc("error: can't move left"), -1 ] ); + next; + } + + my $index = $parent->getIndex; + $parent->removeChild($value); + $grandparent->insertChild( $index, $value ); + if ( $parent->isLeaf ) { + $grandparent->removeChild($parent); + } + } + } + else { + push( @results, [ loc("error: nothing to move"), -1 ] ); + } +} +elsif ( $ARGS{"Right"} ) { + if (@$Selected) { + foreach my $value (@$Selected) { + my $parent = $value->getParent; + my $index = $value->getIndex; + + my $newparent; + if ( $index > 0 ) { + my $sibling = $parent->getChild( $index - 1 ); + $newparent = $sibling unless $sibling->isLeaf; + } + $newparent ||= RT::Interface::Web::QueryBuilder::Tree->new( $ARGS{'AndOr'} || 'AND', $parent ); + + $parent->removeChild($value); + $newparent->addChild($value); + } + } + else { + push( @results, [ loc("error: nothing to move"), -1 ] ); + } +} +elsif ( $ARGS{"DeleteClause"} ) { + if (@$Selected) { + my (@top); + my %Selected = map { $_ => 1 } @$Selected; + foreach my $node ( @$Selected ) { + my $tmp = $node->getParent; + while ( !$Selected{ $tmp } && !$tmp->isRoot ) { + $tmp = $tmp->getParent; + } + next if $Selected{ $tmp }; + push @top, $node; + } + + my %seen; + my @non_siblings_top = grep !$seen{ $_->getParent }++, @top; + + foreach ( @New ) { + my $add = $_->clone; + foreach my $selected( @non_siblings_top ) { + my $newindex = $selected->getIndex + 1; + $selected->insertSibling( $newindex, $add ); + } + $add->getParent->setNodeValue( $ARGS{'AndOr'} ); + push @NewSelection, $add; + } + @New = (); + + while( my $node = shift @top ) { + my $parent = $node->getParent; + $parent->removeChild($node); + $node->DESTROY; + } + @$Selected = (); + } + else { + push( @results, [ loc("error: nothing to delete"), -1 ] ); + } +} +elsif ( $ARGS{"Toggle"} ) { + if (@$Selected) { + my %seen; + my @unique_nodes = grep !$seen{ $_ + 0 }++, + map ref $_->getNodeValue? $_->getParent: $_, + @$Selected; + + foreach my $node ( @unique_nodes ) { + if ( $node->getNodeValue eq 'AND' ) { + $node->setNodeValue('OR'); + } + else { + $node->setNodeValue('AND'); + } + } + } + else { + push( @results, [ loc("error: nothing to toggle"), -1 ] ); + } +} + +if ( @New && @$Selected ) { + my %seen; + my @non_siblings_selected = grep !$seen{ $_->getParent }++, @$Selected; + + foreach ( @New ) { + my $add = $_->clone; + foreach my $selected( @non_siblings_selected ) { + my $newindex = $selected->getIndex + 1; + $selected->insertSibling( $newindex, $add ); + } + $add->getParent->setNodeValue( $ARGS{'AndOr'} ); + push @NewSelection, $add; + } + @$Selected = (); +} +elsif ( @New ) { + foreach ( @New ) { + my $add = $_->clone; + $Tree->addChild( $add ); + push @NewSelection, $add; + } + $Tree->setNodeValue( $ARGS{'AndOr'} ); +} +$_->DESTROY foreach @New; + +push @$Selected, @NewSelection; + +$Tree->PruneChildlessAggregators; + +return @results; + + diff --git a/rt/share/html/Search/Elements/EditSearches b/rt/share/html/Search/Elements/EditSearches new file mode 100644 index 000000000..62871fd5f --- /dev/null +++ b/rt/share/html/Search/Elements/EditSearches @@ -0,0 +1,296 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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 }}} +<&| /Widgets/TitleBox, title => loc($Title)&> + +%# Hide all the save functionality if the user shouldn't see it. +% if ( $can_modify ) { +<&|/l&>Privacy: +<& SelectSearchObject, Name => 'SavedSearchOwner', Objects => \@Objects, Object => ( $Object && $Object->id ) ? $Object->Object : '' &> +
+<&|/l&>Description: + + +% if ($Id ne 'new') { + +% if ( $Dirty ) { + +% } + +% if ( $AllowCopy ) { + +% } + +% } +% if ( $Object && $Object->Id ) { + +% } else { + +%} +% } +
+
+<&|/l&>Load saved search: +<& SelectSearchesForObjects, Name => 'SavedSearchLoad', Objects => \@Objects, SearchType => $Type &> + + + + +<%INIT> +return unless $session{'CurrentUser'}->HasRight( + Right => 'LoadSavedSearch', + Object => $RT::System, +); + +my $can_modify = $session{'CurrentUser'}->HasRight( + Right => 'CreateSavedSearch', + Object => $RT::System, +); + +use RT::SavedSearches; +my @Objects = RT::SavedSearches->new($session{CurrentUser})->_PrivacyObjects; +push @Objects, RT::System->new( $session{'CurrentUser'} ) + if $session{'CurrentUser'}->HasRight( Object=> $RT::System, + Right => 'SuperUser' ); + +my $is_dirty = sub { + my %arg = ( + Query => {}, + SavedSearch => {}, + SearchFields => [qw(Query Format OrderBy Order RowsPerPage)], + @_ + ); + + my $obj = $arg{'SavedSearch'}->{'Object'}; + return 0 unless $obj && $obj->id; + + foreach( @{ $arg{'SearchFields'} } ) { + return 1 if $obj->SubValue( $_ ) ne $arg{'Query'}->{$_}; + } + + return 0; +}; + +# If we're modifying an old query, check if it's been changed +my $Dirty = $is_dirty->( + Query => $CurrentSearch, + SavedSearch => { Id => $Id, Object => $Object, Description => $Description }, + SearchFields => \@SearchFields, +); + + + +<%ARGS> +$Id => 'new' +$Object => undef +$Type => 'Ticket' +$Description => '' +$CurrentSearch => {} +@SearchFields => () +$AllowCopy => 1 +$Title => loc('Saved searches') + + +<%METHOD Init> +<%ARGS> +$Query => {} +$SavedSearch => {} +@SearchFields => qw(Query Format OrderBy Order RowsPerPage) + +<%INIT> + +$SavedSearch->{'Id'} = ( $ARGS{Type} && $ARGS{Type} eq 'Chart' ? +$ARGS{'SavedChartSearchId'} : $ARGS{'SavedSearchId'} ) || 'new'; +$SavedSearch->{'Description'} = $ARGS{'SavedSearchDescription'} || undef; +$SavedSearch->{'Privacy'} = $ARGS{'SavedSearchOwner'} || undef; + +my @results; + +if ( $ARGS{'SavedSearchRevert'} ) { + $ARGS{'SavedSearchLoad'} = $SavedSearch->{'Id'}; +} + +if ( $ARGS{'SavedSearchLoad'} ) { + my ($container, $id ) = _parse_saved_search ($ARGS{'SavedSearchLoad'}); + if ( $container ) { + my $search = $container->Attributes->WithId( $id ); + $SavedSearch->{'Id'} = $ARGS{'SavedSearchLoad'}; + $SavedSearch->{'Object'} = $search; + $SavedSearch->{'Description'} = $search->Description; + $Query->{$_} = $search->SubValue($_) foreach @SearchFields; + + if ( $ARGS{'SavedSearchRevert'} ) { + push @results, loc('Loaded original "[_1]" saved search', $SavedSearch->{'Description'} ); + } else { + push @results, loc('Loaded saved search "[_1]"', $SavedSearch->{'Description'} ); + } + } + else { + push @results, loc( 'Can not load saved search "[_1]"', + $ARGS{'SavedSearchLoad'} ); + return @results; + } +} +elsif ( $ARGS{'SavedSearchDelete'} ) { + # We set $SearchId to 'new' above already, so peek into the %ARGS + my ($container, $id) = _parse_saved_search( $SavedSearch->{'Id'} ); + if ( $container && $container->id ) { + # We have the object the entry is an attribute on; delete the entry... + $container->Attributes->DeleteEntry( Name => 'SavedSearch', id => $id ); + } + $SavedSearch->{'Id'} = 'new'; + $SavedSearch->{'Object'} = undef; + $SavedSearch->{'Description'} = undef; + push @results, loc("Deleted saved search"); +} +elsif ( $ARGS{'SavedSearchCopy'} ) { + my ($container, $id ) = _parse_saved_search( $ARGS{'SavedSearchId'} ); + $SavedSearch->{'Object'} = $container->Attributes->WithId( $id ); + if ( $ARGS{'SavedSearchDescription'} && $ARGS{'SavedSearchDescription'} ne $SavedSearch->{'Object'}->Description ) { + $SavedSearch->{'Description'} = $ARGS{'SavedSearchDescription'}; + } else { + $SavedSearch->{'Description'} = loc( "[_1] copy", $SavedSearch->{'Object'}->Description ); + } + $SavedSearch->{'Id'} = 'new'; + $SavedSearch->{'Object'} = undef; +} + +if ( $SavedSearch->{'Id'} && $SavedSearch->{'Id'} ne 'new' + && !$SavedSearch->{'Object'} ) +{ + my ($container, $id ) = _parse_saved_search( $ARGS{'SavedSearchId'} ); + $SavedSearch->{'Object'} = $container->Attributes->WithId( $id ); + $SavedSearch->{'Description'} ||= $SavedSearch->{'Object'}->Description; +} + +return @results; + + + + +<%METHOD Save> +<%ARGS> +$Query => {} +$SavedSearch => {} +@SearchFields => qw(Query Format OrderBy Order RowsPerPage) + +<%INIT> + +return unless $ARGS{'SavedSearchSave'} || $ARGS{'SavedSearchCopy'}; + +my @results; +my $obj = $SavedSearch->{'Object'}; +my $id = $SavedSearch->{'Id'}; +my $desc = $SavedSearch->{'Description'}; +my $privacy = $SavedSearch->{'Privacy'}; + +my %params = map { $_ => $Query->{$_} } @SearchFields; +my ($new_obj_type, $new_obj_id) = split(/\-/, ($privacy || '')); + +if ( $obj && $obj->id ) { + # permission check + if ($obj->Object->isa('RT::System')) { + unless ($session{'CurrentUser'}->HasRight( Object=> $RT::System, Right => 'SuperUser')) { + push @results, loc("No permission to save system-wide searches"); + return @results; + } + } + + $obj->SetSubValues( %params ); + $obj->SetDescription( $desc ); + + my $obj_type = ref($obj->Object); + # We need to get current obj_id now, because when we change obj_type to + # RT::System, $obj->Object->Id returns 1, not the old one :( + my $obj_id = $obj->Object->Id; + + if ( $new_obj_type && $new_obj_id ) { + my ($val, $msg); + if ( $new_obj_type ne $obj_type ) { + ($val, $msg ) = $obj->SetObjectType($new_obj_type); + push @results, loc ('Unable to set privacy object: [_1]', $msg) unless ( $val ); + } + if ( $new_obj_id != $obj_id ) { + ($val, $msg) = $obj->SetObjectId($new_obj_id); + push @results, loc ('Unable to set privacy id: [_1]', $msg) unless ( $val ); + } + } else { + push @results, loc('Unable to determine object type or id'); + } + push @results, loc('Updated saved search "[_1]"', $desc); +} +elsif ( $id eq 'new' ) { + my $saved_search = RT::SavedSearch->new( $session{'CurrentUser'} ); + my ($status, $msg) = $saved_search->Save( + Privacy => $privacy, + Name => $desc, + Type => $SavedSearch->{'Type'}, + SearchParams => \%params, + ); + + if ( $status ) { + $SavedSearch->{'Object'} = + $session{'CurrentUser'}->UserObj->Attributes->WithId( $saved_search->Id ); + # Build new SearchId + $SavedSearch->{'Id'} = + ref( $session{'CurrentUser'}->UserObj ) . '-' + . $session{'CurrentUser'}->UserObj->Id + . '-SavedSearch-' + . $SavedSearch->{'Object'}->Id; + } + else { + push @results, loc("Can't find a saved search to work with").': '.loc($msg); + } +} +else { + push @results, loc("Can't save this search"); +} + +return @results; + + + diff --git a/rt/share/html/Search/Elements/Graph b/rt/share/html/Search/Elements/Graph new file mode 100644 index 000000000..620cbc59e --- /dev/null +++ b/rt/share/html/Search/Elements/Graph @@ -0,0 +1,50 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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 }}} +<%INIT> +return $m->comp('/Ticket/Graphs/Elements/ShowGraph', %ARGS); + diff --git a/rt/share/html/Search/Elements/NewListActions b/rt/share/html/Search/Elements/NewListActions new file mode 100644 index 000000000..8e2cbab6f --- /dev/null +++ b/rt/share/html/Search/Elements/NewListActions @@ -0,0 +1,66 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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 }}} +<%loc('Results')%>
+% foreach my $action (@actions) { +% my @item = @$action; +% if ($item[1] < 0) { + +% } + <%$item[0]%>
+% if ($item[1] < 0) { +
+% } +% } +
+<%init> +@actions = map ref $_? $_: [$_, 0], grep defined && length, @actions; +return unless @actions; + +<%ARGS> +@actions => undef + diff --git a/rt/share/html/Search/Elements/PickBasics b/rt/share/html/Search/Elements/PickBasics new file mode 100644 index 000000000..7e4bc7357 --- /dev/null +++ b/rt/share/html/Search/Elements/PickBasics @@ -0,0 +1,214 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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 }}} +% foreach( @lines ) { +<& ConditionRow, Condition => $_ &> +% } +<%INIT> + +my @lines = ( + { + Name => 'id', + Field => loc('id'), + Op => { + Type => 'component', + Path => '/Elements/SelectEqualityOperator', + }, + Value => { Type => 'text', Size => 5 } + }, + { + Name => 'Attachment', + Field => { + Type => 'component', + Path => '/Elements/SelectAttachmentField', + }, + Op => { + Type => 'component', + Path => '/Elements/SelectBoolean', + Arguments => { + True => loc("matches"), + False => loc("doesn't match"), + TrueVal => 'LIKE', + FalseVal => 'NOT LIKE', + }, + }, + Value => { Type => 'text', Size => 20 }, + }, + { + Name => 'Queue', + Field => loc('Queue'), + Op => { + Type => 'component', + Path => '/Elements/SelectBoolean', + Arguments => { TrueVal=> '=', FalseVal => '!=' }, + }, + Value => { + Type => 'component', + Path => '/Elements/SelectQueue', + Arguments => { NamedValues => 1, CheckQueueRight => 'ShowTicket' }, + }, + }, + { + Name => 'Status', + Field => loc('Status'), + Op => { + Type => 'component', + Path => '/Elements/SelectBoolean', + Arguments => { TrueVal=> '=', FalseVal => '!=' }, + }, + Value => { + Type => 'component', + Path => '/Elements/SelectStatus', + Arguments => { SkipDeleted => 1 }, + }, + }, + { + Name => 'Actor', + Field => { + Type => 'select', + Options => [ + Owner => loc('Owner'), + Creator => loc('Creator'), + LastUpdatedBy => loc('Last updated by'), + ], + }, + Op => { + Type => 'component', + Path => '/Elements/SelectBoolean', + Arguments => { TrueVal=> '=', FalseVal => '!=' }, + }, + Value => { + Type => 'component', + Path => '/Elements/SelectOwner', + Arguments => { ValueAttribute => 'Name' }, + }, + }, + { + Name => 'Watcher', + Field => { + Type => 'component', + Path => 'SelectPersonType', + Arguments => { Default => 'Requestor' }, + }, + Op => { + Type => 'component', + Path => '/Elements/SelectMatch', + }, + Value => { Type => 'text', Size => 20 } + }, + { + Name => 'Date', + Field => { + Type => 'component', + Path => '/Elements/SelectDateType', + }, + Op => { + Type => 'component', + Path => '/Elements/SelectDateRelation', + }, + Value => { + Type => 'component', + Path => '/Elements/SelectDate', + Arguments => { ShowTime => 0, Default => '' }, + }, + }, + { + Name => 'Time', + Field => { + Type => 'select', + Options => [ + TimeWorked => loc('Time Worked'), + TimeEstimated => loc('Time Estimated'), + TimeLeft => loc('Time Left'), + ], + }, + Op => { + Type => 'component', + Path => '/Elements/SelectEqualityOperator', + }, + Value => [ + { Type => 'text', Size => 5 }, + { + Type => 'component', + Path => '/Elements/SelectTimeUnits', + }, + ], + }, + { + Name => 'Priority', + Field => { + Type => 'select', + Options => [ + Priority => loc('Priority'), + InitialPriority => loc('Initial Priority'), + FinalPriority => loc('Final Priority'), + ], + }, + Op => { + Type => 'component', + Path => '/Elements/SelectEqualityOperator', + }, + Value => { + Type => 'component', + Path => '/Elements/SelectPriority', + }, + }, + { + Name => 'Links', + Field => { Type => 'component', Path => 'SelectLinks' }, + Op => { + Type => 'component', + Path => '/Elements/SelectBoolean', + Arguments => { TrueVal=> '=', FalseVal => '!=' }, + }, + Value => { Type => 'text', Size => 5 } + }, +); + +$m->callback( Conditions => \@lines ); + + diff --git a/rt/share/html/Search/Elements/PickCFs b/rt/share/html/Search/Elements/PickCFs new file mode 100644 index 000000000..ba25cdeda --- /dev/null +++ b/rt/share/html/Search/Elements/PickCFs @@ -0,0 +1,104 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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 }}} +% foreach( @lines ) { +<& ConditionRow, Condition => $_ &> +% } +<%INIT> +my $CustomFields = RT::CustomFields->new( $session{'CurrentUser'}); +foreach my $id (keys %cfqueues) { + # Gotta load up the $queue object, since queues get stored by name now. my $id + my $queue = RT::Queue->new($session{'CurrentUser'}); + $queue->Load($id); + unless ($queue->id) { + # XXX TODO: This ancient code dates from a former developer + # we have no idea what it means or why cfqueues are so encoded. + $id =~ s/^.'*(.*).'*$/$1/; + + # unescape internal quotes + $id =~ s/(\\(.))/$2 eq "'" ? "'" : $1/eg; + + $queue->Load($id); + } + $CustomFields->LimitToQueue($queue->Id); +} +$CustomFields->LimitToGlobal; +$m->callback( + CallbackName => 'MassageCustomFields', + CustomFields => $CustomFields, +); + + +my @lines; +while ( my $CustomField = $CustomFields->Next ) { + my %line; + $line{'Name'} = "'CF.{" . $CustomField->Name . "}'"; + $line{'Field'} = $CustomField->Name; + $line{'Op'} = { + Type => 'component', + Path => '/Elements/SelectCustomFieldOperator', + Arguments => { True => loc("is"), + False => loc("isn't"), + TrueVal=> '=', + FalseVal => '!=', + }, + }; + $line{'Value'} = { + Type => 'component', + Path => '/Elements/SelectCustomFieldValue', + Arguments => { CustomField => $CustomField }, + }; + push @lines, \%line; +} + +$m->callback( Conditions => \@lines, Queues => \%cfqueues ); + + + +<%ARGS> +%cfqueues => undef + diff --git a/rt/share/html/Search/Elements/PickCriteria b/rt/share/html/Search/Elements/PickCriteria new file mode 100644 index 000000000..b024775ef --- /dev/null +++ b/rt/share/html/Search/Elements/PickCriteria @@ -0,0 +1,72 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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 }}} +<&| /Widgets/TitleBox, title => loc('Add Criteria')&> + + + + + +<& PickBasics &> +<& PickCFs, cfqueues => \%cfqueues &> + + + + + + + + +

<&|/l&>Aggregator<& SelectAndOr, Name => "AndOr" &>
+ + + +<%ARGS> +$addquery => 0 +$query => undef +%cfqueues => undef + diff --git a/rt/share/html/Search/Elements/ResultViews b/rt/share/html/Search/Elements/ResultViews new file mode 100644 index 000000000..b438b56a0 --- /dev/null +++ b/rt/share/html/Search/Elements/ResultViews @@ -0,0 +1,80 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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> +$QueryString => undef +$Query => undef +$Format => undef +$Rows => undef +$OrderBy => undef +$Order => undef +$RSSFeedURL => undef +$ShortQueryString => undef + + + +
+% my %hiddens = (Query => $Query, Format => $Format, Rows => $Rows, OrderBy => $OrderBy, Order => $Order); +% foreach my $key (keys(%hiddens)) { + +% } +<&|/l, $m->scomp('SelectChartType', Name => 'ChartStyle'), $m->scomp('SelectGroupBy', Name => 'PrimaryGroupBy', Query => $Query) +&>[_1] chart by [_2] +
+<%init> +my $ical_path = join '/', map $m->interp->apply_escapes($_, 'u'), + $session{'CurrentUser'}->UserObj->Name, + $session{'CurrentUser'}->UserObj->GenerateAuthString( $Query ), + $Query; + diff --git a/rt/share/html/Search/Elements/SearchPrivacy b/rt/share/html/Search/Elements/SearchPrivacy new file mode 100644 index 000000000..a3640fb01 --- /dev/null +++ b/rt/share/html/Search/Elements/SearchPrivacy @@ -0,0 +1,55 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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> +$Object => undef + +% if (ref($Object) eq 'RT::User' && $Object->id == $session{'CurrentUser'}->Id) { +<&|/l&>My saved searches +% } else { +<&|/l, $Object->Name&>[_1]'s saved searches +% } diff --git a/rt/share/html/Search/Elements/SearchesForObject b/rt/share/html/Search/Elements/SearchesForObject new file mode 100644 index 000000000..8534f8df5 --- /dev/null +++ b/rt/share/html/Search/Elements/SearchesForObject @@ -0,0 +1,65 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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> +$Object => undef + +<%init> +# Returns an array of search objects associated on $Object, +# in the form of [Description, searchObj] +my @result; +while (my $search = $Object->Attributes->Next) { + my $desc; + if ($search->Name eq 'SavedSearch') { + push @result, [$search->Description, $search]; + } + elsif ($search->Name =~ m/^Search - (.*)/) { + push @result, [$1, $search]; + } +} +return @result; + diff --git a/rt/share/html/Search/Elements/SelectAndOr b/rt/share/html/Search/Elements/SelectAndOr new file mode 100644 index 000000000..52685ba3f --- /dev/null +++ b/rt/share/html/Search/Elements/SelectAndOr @@ -0,0 +1,53 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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 }}} +<&|/l&>AND +<&|/l&>OR + +<%ARGS> +$Name => "Operator" + diff --git a/rt/share/html/Search/Elements/SelectChartType b/rt/share/html/Search/Elements/SelectChartType new file mode 100644 index 000000000..fcb723497 --- /dev/null +++ b/rt/share/html/Search/Elements/SelectChartType @@ -0,0 +1,58 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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 => 'ChartType' +$Default => 'bar' + + diff --git a/rt/share/html/Search/Elements/SelectGroup b/rt/share/html/Search/Elements/SelectGroup new file mode 100644 index 000000000..f6583b114 --- /dev/null +++ b/rt/share/html/Search/Elements/SelectGroup @@ -0,0 +1,67 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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 }}} + + +<%INIT> +my $groups = new RT::Groups($session{'CurrentUser'}); +$groups->Limit(FIELD => 'Domain', OPERATOR => '=', VALUE => $Domain); + + +<%ARGS> +$AllowNull => 1 +$Default=> '' +$Name => 'Group' +$Domain => 'UserDefined'; + diff --git a/rt/share/html/Search/Elements/SelectGroupBy b/rt/share/html/Search/Elements/SelectGroupBy new file mode 100644 index 000000000..2a1b38718 --- /dev/null +++ b/rt/share/html/Search/Elements/SelectGroupBy @@ -0,0 +1,63 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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 => 'GroupBy' +$Default => 'Status' +$Query => '' + + +<%init> +use RT::Report::Tickets; +my $report = RT::Report::Tickets->new( $session{'CurrentUser'} ); +my @options = $report->Groupings( Query => $Query ); + diff --git a/rt/share/html/Search/Elements/SelectLinks b/rt/share/html/Search/Elements/SelectLinks new file mode 100644 index 000000000..219a19241 --- /dev/null +++ b/rt/share/html/Search/Elements/SelectLinks @@ -0,0 +1,66 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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 => 'LinksField' + + +<%INIT> +my @fields = ('HasMember', + 'MemberOf', + 'DependsOn', + 'DependedOnBy', + 'RefersTo', + 'ReferredToBy', + 'LinkedTo', + ); + diff --git a/rt/share/html/Search/Elements/SelectPersonType b/rt/share/html/Search/Elements/SelectPersonType new file mode 100644 index 000000000..5f6ac7365 --- /dev/null +++ b/rt/share/html/Search/Elements/SelectPersonType @@ -0,0 +1,84 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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 }}} + + +<%INIT> +my @types; +if ($Scope =~ 'queue') { + @types = qw(Cc AdminCc); +} +elsif ($Suffix eq 'Group') { + @types = qw(Requestor Cc AdminCc Watcher); +} +else { + @types = qw(Requestor Cc AdminCc Watcher Owner QueueCc QueueAdminCc QueueWatcher); +} + +my @subtypes = qw(EmailAddress Name RealName Nickname Organization Address1 Address2 WorkPhone HomePhone MobilePhone PagerPhone id); + + +<%ARGS> +$AllowNull => 1 +$Suffix => '' +$Default=>undef +$Scope => 'ticket' +$Name => 'WatcherType' + diff --git a/rt/share/html/Search/Elements/SelectSearchObject b/rt/share/html/Search/Elements/SelectSearchObject new file mode 100644 index 000000000..c38f5c396 --- /dev/null +++ b/rt/share/html/Search/Elements/SelectSearchObject @@ -0,0 +1,68 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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> +@Objects => undef +$Name => undef +$Object => undef + +<%init> +my $default_privacy = ''; +if ( $Object && $Object->Id ) { + $default_privacy = ref($Object).'-'.$Object->Id; +} + + diff --git a/rt/share/html/Search/Elements/SelectSearchesForObjects b/rt/share/html/Search/Elements/SelectSearchesForObjects new file mode 100644 index 000000000..1a53ad931 --- /dev/null +++ b/rt/share/html/Search/Elements/SelectSearchesForObjects @@ -0,0 +1,69 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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> +@Objects => undef +$Name => undef +$SearchType => 'Ticket', + + diff --git a/rt/share/html/Search/Graph.html b/rt/share/html/Search/Graph.html new file mode 100644 index 000000000..4ceb544de --- /dev/null +++ b/rt/share/html/Search/Graph.html @@ -0,0 +1,50 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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 }}} +<%INIT> +return $m->comp('/Ticket/Graphs/index.html', %ARGS ); + diff --git a/rt/share/html/Search/Results.html b/rt/share/html/Search/Results.html new file mode 100755 index 000000000..13252eebb --- /dev/null +++ b/rt/share/html/Search/Results.html @@ -0,0 +1,201 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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 }}} +<& /Elements/Header, Title => $title, + Refresh => $session{'tickets_refresh_interval'} || RT->Config->Get('SearchResultsRefreshInterval', $session{'CurrentUser'} ), + RSSAutoDiscovery => $RSSFeedURL, + LinkRel => \%link_rel &> +<& /Ticket/Elements/Tabs, + current_tab => "Search/Results.html".$QueryString, + Title => $title, + Format => $Format, + Query => $Query, + Rows => $Rows, + OrderBy => $OrderBy, + Order => $Order, + SavedSearchId => $SavedSearchId, + SavedChartSearchId => $SavedChartSearchId, + &> +<& /Elements/CollectionList, + Query => $Query, + AllowSorting => 1, + OrderBy => $OrderBy, + Order => $Order, + Rows => $Rows, + Page => $Page, + Format => $Format, + Class => 'RT::Tickets', + BaseURL => $BaseURL + + &> +% my %hiddens = (Query => $Query, Format => $Format, Rows => $Rows, OrderBy => $OrderBy, Order => $Order, HideResults => $HideResults, Page => $Page, SavedChartSearchId => $SavedChartSearchId ); +
+
+% foreach my $key (keys(%hiddens)) { + +% } +<& /Elements/Refresh, Name => 'TicketsRefreshInterval', Default => $session{'tickets_refresh_interval'}||RT->Config->Get('SearchResultsRefreshInterval', $session{'CurrentUser'}) &> + +
+
+
+<& Elements/ResultViews, + QueryString => $QueryString, + Query => $Query, + Format => $Format, + Rows => $Rows, + OrderBy => $OrderBy, + Order => $Order, + RSSFeedURL => $RSSFeedURL, + ShortQueryString => $ShortQueryString, +&> + +% $m->callback( QueryString => $QueryString, CallbackName => 'SearchActions' ); +
+<%INIT> +# Read from user preferences +my $prefs = $session{'CurrentUser'}->UserObj->Preferences("SearchDisplay") || {}; + +# These variables are what define a search_hash; this is also +# where we give sane defaults. +$Format ||= $prefs->{'Format'} || RT->Config->Get('DefaultSearchResultFormat'); +$Order ||= $prefs->{'Order'} || 'ASC'; +$OrderBy ||= $prefs->{'OrderBy'} || 'id'; + +# Some forms pass in "RowsPerPage" rather than "Rows" +# We call it RowsPerPage everywhere else. + +if ( !defined($Rows) ) { + if (defined $ARGS{'RowsPerPage'} ) { + $Rows = $ARGS{'RowsPerPage'}; + } elsif ( defined $prefs->{'RowsPerPage'} ) { + $Rows = $prefs->{'RowsPerPage'}; + } else { + $Rows = 50; + } +} + +my ($title, $ticketcount); +$session{'i'}++; +$session{'tickets'} = RT::Tickets->new($session{'CurrentUser'}) ; +$session{'tickets'}->FromSQL($Query) if ($Query); + +if ($OrderBy =~ /\|/) { + # Multiple Sorts + my @OrderBy = split /\|/,$OrderBy; + my @Order = split /\|/,$Order; + $session{'tickets'}->OrderByCols( + map { { FIELD => $OrderBy[$_], ORDER => $Order[$_] } } ( 0 + .. $#OrderBy ) );; +} else { + $session{'tickets'}->OrderBy(FIELD => $OrderBy, ORDER => $Order); +} + +$session{'CurrentSearchHash'} = { + Format => $Format, + Query => $Query, + Page => $Page, + Order => $Order, + OrderBy => $OrderBy, + RowsPerPage => $Rows + }; + + +if ( $session{'tickets'}->Query()) { + $ticketcount = $session{tickets}->CountAll(); + $title = loc('Found [quant,_1,ticket]', $ticketcount); +} else { + $title = loc("Find tickets"); +} + +my $QueryString = "?".$m->comp('/Elements/QueryString', + Query => $Query, + Format => $Format, + Rows => $Rows, + OrderBy => $OrderBy, + Order => $Order, + Page => $Page); +my $ShortQueryString = "?".$m->comp('/Elements/QueryString', Query => $Query); +my $RSSQueryString = "?".$m->comp('/Elements/QueryString', Query => $Query, Order => $Order, OrderBy => $OrderBy); +my $RSSFeedURL = RT->Config->Get('WebPath')."/Search/Results.rdf$RSSQueryString"; + +if ($ARGS{'TicketsRefreshInterval'}) { + $session{'tickets_refresh_interval'} = $ARGS{'TicketsRefreshInterval'}; +} + +my %link_rel; +my $genpage = sub { + return $m->comp( + '/Elements/QueryString', + Query => $Query, + Format => $Format, + Rows => $Rows, + OrderBy => $OrderBy, + Order => $Order, + Page => shift(@_), + ); +}; +my $BaseURL = RT->Config->Get('WebPath')."/Search/Results.html?"; +$link_rel{first} = $BaseURL . $genpage->(1) if $Page > 1; +$link_rel{prev} = $BaseURL . $genpage->($Page - 1) if $Page > 1; +$link_rel{next} = $BaseURL . $genpage->($Page + 1) if ($Page * $Rows) < $ticketcount; +$link_rel{last} = $BaseURL . $genpage->(POSIX::ceil($ticketcount/$Rows)) if $Rows and ($Page * $Rows) < $ticketcount; + +<%CLEANUP> +$session{'tickets'}->PrepForSerialization(); + +<%ARGS> +$Query => undef +$Format => undef +$HideResults => 0 +$Rows => undef +$Page => 1 +$OrderBy => undef +$Order => undef +$SavedSearchId => undef +$SavedChartSearchId => undef + diff --git a/rt/share/html/Search/Results.rdf b/rt/share/html/Search/Results.rdf new file mode 100644 index 000000000..0a1943059 --- /dev/null +++ b/rt/share/html/Search/Results.rdf @@ -0,0 +1,103 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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 }}} +<%INIT> + +my $Tickets = RT::Tickets->new($session{'CurrentUser'}); +$Tickets->FromSQL($ARGS{'Query'}); +if ($OrderBy =~ /\|/) { + # Multiple Sorts + my @OrderBy = split /\|/,$OrderBy; + my @Order = split /\|/,$Order; + $Tickets->OrderByCols( + map { { FIELD => $OrderBy[$_], ORDER => $Order[$_] } } ( 0 + .. $#OrderBy ) );; +} else { + $Tickets->OrderBy(FIELD => $OrderBy, ORDER => $Order); +} +$r->content_type('application/rss+xml'); + + + + # create an RSS 1.0 file (http://purl.org/rss/1.0/) + use XML::RSS; + my $rss = new XML::RSS (version => '1.0'); + $rss->channel( + title => RT->Config->Get('rtname').": Search" . $ARGS{'Query'}, + link => RT->Config->Get('WebURL'), + description => "", + dc => { + }, + generator => "RT v" . $RT::VERSION, + syn => { + updatePeriod => "hourly", + updateFrequency => "1", + updateBase => "1901-01-01T00:00+00:00", + }, + ); + + + while ( my $Ticket = $Tickets->Next()) { + my $creator_str = $m->scomp('/Elements/ShowUser', User => $Ticket->CreatorObj); + $creator_str =~ s/[\r\n]//g; + $rss->add_item( + title => $Ticket->Subject || loc('No Subject'), + link => RT->Config->Get('WebURL')."Ticket/Display.html?id=".$Ticket->id, + description => $Ticket->Transactions->First->Content, + dc => { creator => $creator_str, + date => $Ticket->CreatedObj->RFC2822, + }, + guid => $Ticket->Queue . '_' . $Ticket->id, + ); + } +$m->out($rss->as_string); +$m->abort(); + +<%ARGS> +$OrderBy => 'Created' +$Order => 'ASC' + diff --git a/rt/share/html/Search/Results.tsv b/rt/share/html/Search/Results.tsv new file mode 100644 index 000000000..bb3ac4482 --- /dev/null +++ b/rt/share/html/Search/Results.tsv @@ -0,0 +1,162 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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> +$Query => '' +$OrderBy => 'id' +$Order => 'ASC' + +<%INIT> + +my $Tickets = RT::Tickets->new( $session{'CurrentUser'} ); +$Tickets->FromSQL( $Query ); +if ( $OrderBy =~ /\|/ ) { + # Multiple Sorts + my @OrderBy = split /\|/, $OrderBy; + my @Order = split /\|/, $Order; + $Tickets->OrderByCols( + map { { FIELD => $OrderBy[$_], ORDER => $Order[$_] } } + ( 0 .. $#OrderBy ) + ); +} +else { + $Tickets->OrderBy( FIELD => $OrderBy, ORDER => $Order ); +} + +my %cf_id_to_name; +my %cf_name_to_pos; +{ + my $cfs = RT::SQL::PossibleCustomFields( + Query => $Query, CurrentUser => $session{'CurrentUser'}, + ); + while ( my $cf = $cfs->Next ) { + my $name = $cf->Name; + $cf_id_to_name{ $cf->id } = $name; + next if $cf_name_to_pos{ $name }; + + $cf_name_to_pos{ $name } = + (sort { $b <=> $a } values %cf_name_to_pos)[0] + 1; + } +} + +my @attrs = qw( + id QueueObj->Name Subject Status + TimeEstimated TimeWorked TimeLeft + Priority FinalPriority + OwnerObj->Name + Requestors->MemberEmailAddressesAsString + Cc->MemberEmailAddressesAsString + AdminCc->MemberEmailAddressesAsString + DueObj->ISO ToldObj->ISO CreatedObj->ISO + ResolvedObj->ISO LastUpdatedObj->ISO +); + +$r->content_type('application/vnd.ms-excel'); +{ + my @header; + foreach my $attr (@attrs) { + my $label = $attr; + $label =~ s'Obj-.(?:AsString|Name|ISO)''g; + $label =~ s'-\>MemberEmailAddressesAsString''g; + push @header, $label; + } + + $_ += @header - 1 foreach values %cf_name_to_pos; + + foreach my $name ( sort { $cf_name_to_pos{$a} <=> $cf_name_to_pos{$a} } keys %cf_name_to_pos ) { + push @header, "CF-". $name; + } + $m->out(join("\t", @header)); + $m->out("\n"); + $m->flush_buffer; +} + +my $i = 0; +while ( my $Ticket = $Tickets->Next()) { + my @row; + foreach my $attr (@attrs) { + my $value; + if ($attr =~ /(.*)->ISO$/ and $Ticket->$1->Unix <= 0) { + $value = ''; + } else { + my $method = '$Ticket->'.$attr.'()'; + $method =~ s/->ISO\(\)$/->ISO( Timezone => 'user' )/; + $value = eval $method; + if ($@) {die "Failed to find $attr - ". $@}; + } + push @row, $value; + } + + my $values = $Ticket->CustomFieldValues; + $values->OrderByCols; # don't sort them + while (my $value = $values->Next) { + my $pos = $cf_name_to_pos{ $cf_id_to_name{ $value->CustomField } }; + next unless $pos; + + $row[$pos] = '' unless defined $row[$pos]; + $row[$pos] .= ', ' if $row[$pos]; + $row[$pos] .= $value->Content; + } + + # remove tabs from all field values, they screw up the tsv + for (@row) { + $_ = '' unless defined; + $_ =~ s/(?:\n|\r)//g; + $_ =~ s{\t}{ }g; + } + + $m->out(join("\t",@row)); + $m->out("\n"); + + unless (++$i%10) { + $i = 0; + $m->flush_buffer; + } +} + +$m->abort(); + diff --git a/rt/share/html/Search/Simple.html b/rt/share/html/Search/Simple.html new file mode 100644 index 000000000..2f7996b9c --- /dev/null +++ b/rt/share/html/Search/Simple.html @@ -0,0 +1,106 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 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 }}} +<& /Elements/Header, Title => $title &> +<& /Elements/Tabs, + current_toptab => "Search/Simple.html", + Title => $title +&> + +% $m->callback( %ARGS, CallbackName => 'PreForm' ); + +
+
+ +

<&|/l&>Search for tickets. Enter id numbers, queues by name, Owners by username and Requestors by email address.

+ +

<&|/l&>Searching the full text of every ticket can take a long time, but if you need to do it, you can search for any word in full ticket history for any word by typing fulltext:word.

+

<&|/l&>RT will look for anything else you enter in ticket subjects.

+ +
+
+
+ +
+ +
+ +% $m->callback( %ARGS, CallbackName => 'PostForm' ); + +
+ +<%INIT> +my $title = loc("Search for tickets"); +use RT::Search::Googleish; + +if ($q) { + my $tickets = new RT::Tickets( $session{'CurrentUser'} ); + $m->callback( %ARGS, query => \$q, CallbackName => 'ModifyQuery' ); + + if ($q =~ /^#?(\d+)$/) { + RT::Interface::Web::Redirect(RT->Config->Get('WebURL')."Ticket/Display.html?id=".$1); + } + + my %args = ( + Argument => $q, + TicketsObj => $tickets, + ); + + $m->callback( %ARGS, CallbackName => 'SearchArgs', args => \%args); + + my $search = RT::Search::Googleish->new(%args); + + $m->comp( "Results.html", Query => $search->QueryToSQL() ); + $m->comp( "/Elements/Footer" ); + $m->abort(); +} + + +<%ARGS> +$q => undef + + -- cgit v1.2.1