diff options
Diffstat (limited to 'rt/share/html/Search/Elements')
25 files changed, 2890 insertions, 0 deletions
diff --git a/rt/share/html/Search/Elements/BuildFormatString b/rt/share/html/Search/Elements/BuildFormatString new file mode 100644 index 000000000..dc07c683b --- /dev/null +++ b/rt/share/html/Search/Elements/BuildFormatString @@ -0,0 +1,254 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +%# <sales@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +%# 02110-1301 or visit their web page on the internet at +%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +<%ARGS> +$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 +</%ARGS> +<%init> +# This can't be in a <once> 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 + + Customer Agent CustomerClass CustomerTags + + 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 = "<blank>" 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 ( defined($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} .= "<b>"; + $column{Suffix} .= "</b>"; + } + if ( $Face eq "Italic" ) { + $column{Prefix} .= "<i>"; + $column{Suffix} .= "</i>"; + } + if ($Size) { + $column{Prefix} .= "<" . $m->interp->apply_escapes( $Size, 'h' ) . ">"; + $column{Suffix} .= "</" . $m->interp->apply_escapes( $Size, 'h' ) . ">"; + } + if ( $Link eq "Display" ) { + $column{Prefix} .= q{<a HREF="__WebPath__/Ticket/Display.html?id=__id__">}; + $column{Suffix} .= "</a>"; + } + elsif ( $Link eq "Take" ) { + $column{Prefix} .= q{<a HREF="__WebPath__/Ticket/Display.html?Action=Take&id=__id__">}; + $column{Suffix} .= "</a>"; + } + elsif ( $Link eq "Respond" ) { + $column{Prefix} .= q{<a HREF="__WebPath__/Ticket/Update.html?Action=Respond&id=__id__">}; + $column{Suffix} .= "</a>"; + } + elsif ( $Link eq "Comment" ) { + $column{Prefix} .= q{<a HREF="__WebPath__/Ticket/Update.html?Action=Comment&id=__id__">}; + $column{Suffix} .= "</a>"; + } + elsif ( $Link eq "Resolve" ) { + $column{Prefix} .= q{<a HREF="__WebPath__/Ticket/Update.html?Action=Comment&DefaultStatus=resolved&id=__id__">}; + $column{Suffix} .= "</a>"; + } + + 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 "<blank>" ); + $row .= $field->{'Suffix'} if defined $field->{'Suffix'}; + $row .= "'"; + push( @format_string, $row ); +} + +$Format = join(",\n", @format_string); + + +return($Format, \@fields, \@seen); + +</%init> diff --git a/rt/share/html/Search/Elements/Chart b/rt/share/html/Search/Elements/Chart new file mode 100644 index 000000000..e25a9efd0 --- /dev/null +++ b/rt/share/html/Search/Elements/Chart @@ -0,0 +1,153 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +%# <sales@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +%# 02110-1301 or visit their web page on the internet at +%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +<%args> +$Query => "id > 0" +$PrimaryGroupBy => 'Queue' +$SecondaryGroupBy => undef +$ChartStyle => 'bars' +</%args> +<%init> +use RT::Report::Tickets; +$PrimaryGroupBy ||= 'Queue'; # make sure PrimaryGroupBy is not undef + +my $tix = RT::Report::Tickets->new( $session{'CurrentUser'} ); +my %AllowedGroupings = reverse $tix->Groupings( Query => $Query ); +$PrimaryGroupBy = 'Queue' unless exists $AllowedGroupings{$PrimaryGroupBy}; +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->LabelValue( $value_name ) ); + push @keys, $q->Name; + } + else { + push @keys, $entry->LabelValue( $value_name ); + } + $keys[-1] ||= loc('(no value)'); + push @values, $entry->__Value( $count_name ); +} + +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); +</%init> + +<% loc('Query:') %> <% $Query %><br /> + +% if (RT->Config->Get('DisableGD')) { +<% loc('Graphical charts are not available.') %><br /> +% } else { +<img src="<%RT->Config->Get('WebPath')%>/Search/Chart?<%$query_string|n%>" /><br /> +% } + +<table class="collection-as-table"> +<tr> +<th class="collection-as-table"><% loc($tix->Label($PrimaryGroupBy)) %> +</th> +<th class="collection-as-table"><&|/l&>Tickets</&> +</th> +</tr> +% my ($i,$total); +% while (my $key = shift @sorted_keys) { +% $i++; +% my $value = shift @sorted_values; +% $total += $value; +<tr class="<%$i%2 ? 'evenline' : 'oddline' %>"> +<td class="label collection-as-table"> +%# TODO sadly we don't have "creator.city is null" or alike support yet +%# so no link if the key is undef for now +% if ( $PrimaryGroupBy !~ /(Hourly|Daily|Monthly|Annually)$/ +% && $key ne loc('(no value)') ) { +% my $group = $PrimaryGroupBy; $group =~ s! !.!; +% my %orig_keys = reverse %loc_keys; +% my $QueryString = $m->comp('/Elements/QueryString', +% Query => "$Query and $group = '$orig_keys{$key}'", +% Format => $ARGS{Format}, +% Rows => $ARGS{Rows}, +% OrderBy => $ARGS{OrderBy}, +% Order => $ARGS{Order}, +% ); +<a href=<% RT->Config->Get('WebURL') %>Search/Results.html?<%$QueryString%>><%$key%></a> +% } else { +<% $key %> +% } +</td> +<td class="value collection-as-table"> +<%$value%> +</td> +</tr> +% } + +%$i++; +<tr class="<%$i%2 ? 'evenline' : 'oddline' %>"> +<td class="label collection-as-table"> +<%loc('Total')%> +</td> +<td class="value collection-as-table"> +<%$total||''%> +</td> +</tr> + +</table> diff --git a/rt/share/html/Search/Elements/ConditionRow b/rt/share/html/Search/Elements/ConditionRow new file mode 100644 index 000000000..fe21f4d66 --- /dev/null +++ b/rt/share/html/Search/Elements/ConditionRow @@ -0,0 +1,97 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +%# <sales@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +%# 02110-1301 or visit their web page on the internet at +%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +<tr> +<td class="label"><% $handle_block->( $Condition->{'Field'}, $Condition->{'Name'} .'Field' ) |n %></td> +<td class="operator"><% $handle_block->( $Condition->{'Op'}, $Condition->{'Name'} .'Op') |n %></td> +<td class="value"><% $handle_block->( $Condition->{'Value'}, 'ValueOf'. $Condition->{'Name'} ) |n %></td> +</tr> +<%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{<input id="$name" name="$name" value="$default" $size />}; + } + if ( $box->{'Type'} eq 'select' ) { + my $res = ''; + $res .= qq{<select id="$name" name="$name">}; + my @options = @{ $box->{'Options'} }; + while( my $k = shift @options ) { + my $v = shift @options; + $res .= qq{<option value="$k">$v</option>}; + } + $res .= qq{</select>}; + return $res; + } +}; + +</%INIT> +<%ARGS> +$Condition => {} +</%ARGS> diff --git a/rt/share/html/Search/Elements/DisplayOptions b/rt/share/html/Search/Elements/DisplayOptions new file mode 100644 index 000000000..c83035884 --- /dev/null +++ b/rt/share/html/Search/Elements/DisplayOptions @@ -0,0 +1,136 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +%# <sales@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +%# 02110-1301 or visit their web page on the internet at +%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +<&| /Widgets/TitleBox, title => loc("Sorting"), id => 'sorting' &> +<table valign="top"> + +% for my $o (0..3) { +% $Order[$o] ||= ''; $OrderBy[$o] ||= ''; +<tr> +<td class="label"> +% if ($o == 0) { +<&|/l&>Order by</&>: +% } +</td> +<td class="value"> +<select name="OrderBy"> +% if ($o > 0) { +<option value=""><&|/l&>~[none~]</&></option> +% } +% foreach my $field (sort keys %fields) { +% next unless $field; +<option value="<%$field%>" +% if (defined $OrderBy[$o] and $field eq $OrderBy[$o]) { +selected="selected" +% } +><% loc($field) %></option> +% } +</select> +<select name="Order"> +<option value="ASC" +% unless ( ($Order[$o]||'') eq "DESC" ) { +selected="selected" +% } +><&|/l&>Asc</&></option> +<option value="DESC" +% if ( ($Order[$o]||'') eq "DESC" ) { +selected="selected" +% } +><&|/l&>Desc</&></option> +</select> +</td> +</tr> +% } +<tr> +<td class="label"> +<&|/l&>Rows per page</&>: +</td><td class="value"> +<& /Elements/SelectResultsPerPage, + Name => "RowsPerPage", + Default => $RowsPerPage &> +</td> +</tr> +</table> +</&> +<&| /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; + +$fields{"Customer.$_"} = 1 foreach qw( Number Name ); #Freeside + +my @Order = split /\|/, $Order; +my @OrderBy = split /\|/, $OrderBy; +if ($Order =~ /\|/) { + @Order = split /\|/, $Order; +} else { + @Order = ( $Order ); +} + +</%INIT> + +<%ARGS> +$Order => undef +$OrderBy => undef +$RowsPerPage => undef +$Format => undef +$GroupBy => 'id' +</%ARGS> diff --git a/rt/share/html/Search/Elements/EditFormat b/rt/share/html/Search/Elements/EditFormat new file mode 100644 index 000000000..bb869fe66 --- /dev/null +++ b/rt/share/html/Search/Elements/EditFormat @@ -0,0 +1,113 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +%# <sales@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +%# 02110-1301 or visit their web page on the internet at +%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +<table> + +<tr> +<th><&|/l&>Add Columns</&>:</th> +<th><&|/l&>Format</&>:</th> +<th></th> +<th><&|/l&>Show Columns</&>:</th> +</tr> + +<tr> + +<td valign="top"><select size="6" name="SelectDisplayColumns" multiple="multiple"> +% my %seen; +% foreach my $field ( grep !$seen{lc $_}++, @$AvailableColumns) { +<option value="<% $field %>"><% loc($field) %></option> +% } +</select></td> + +<td><&|/l&>Link</&>: +<select name="Link"> +<option value="None">-</option> +<option value="Display"><&|/l&>Display</&></option> +<option value="Take"><&|/l&>Take</&></option> +<option value="Respond"><&|/l&>Respond</&></option> +<option value="Comment"><&|/l&>Comment</&></option> +<option value="Resolve"><&|/l&>Resolve</&></option> +</select> +<br /><&|/l&>Title</&>: <input name="Title" size="10" /> +<br /><&|/l&>Size</&>: +<select name="Size"> +<option value="">-</option> +<option value="Small"><&|/l&>Small</&></option> +<option value="Large"><&|/l&>Large</&></option> +</select> +<br /><&|/l&>Style</&>: +<select name="Face"> +<option value="">-</option> +<option value="Bold"><&|/l&>Bold</&></option> +<option value="Italic"><&|/l&>Italic</&></option> +</select> +</td> + +<td><input type="submit" class="button" name="AddCol" value=" → " /></td> + +<td valign="top"> +<select size="4" name="CurrentDisplayColumns"> +% my $i=0; +% foreach my $field ( @$CurrentFormat ) { +<option value="<% $i++ %>><% $field->{Column} %>"><% loc( $field->{Column} ) %></option> +% } +</select> +<br /> +<center> +<input type="submit" class="button" name="ColUp" value=" ↑ " /> +<input type="submit" class="button" name="ColDown" value=" ↓ " /> +<input type="submit" class="button" name="RemoveCol" value="<%loc('Delete')%>" /> +</center> +</td> + +</tr> +</table> + +<%ARGS> +$CurrentFormat => undef +$AvailableColumns => undef +</%ARGS> diff --git a/rt/share/html/Search/Elements/EditQuery b/rt/share/html/Search/Elements/EditQuery new file mode 100644 index 000000000..e6f649ea8 --- /dev/null +++ b/rt/share/html/Search/Elements/EditQuery @@ -0,0 +1,243 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +%# <sales@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +%# 02110-1301 or visit their web page on the internet at +%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +<& NewListActions, actions => $actions &> +<&|/Widgets/TitleBox, title => join(': ', grep defined, loc("Current search"), $Description) &> + +<select size="10" name="clauses" style="width: 100%" multiple="multiple"> +% $m->out($optionlist); +</select> + +<p align="center"> +<input type="submit" class="button" name="Up" value=" ↑ " /> +<input type="submit" class="button" name="Down" value=" ↓ " /> +<input type="submit" class="button" name="Left" value=" ← " /> +<input type="submit" class="button" name="Right" value=" → " /> +<input type="submit" class="button" name="Toggle" value="<&|/l&>And/Or</&>" /> +<input type="submit" class="button" name="DeleteClause" value="<&|/l&>Delete</&>" /> +%#<input type="submit" class="button" name="EditQuery" value="Advanced" /> +</p> + +</&> +<%ARGS> +$Description => undef +$optionlist => '' +$actions => [] +</%ARGS> + +<%METHOD Process> +<%ARGS> +$Tree +$Selected +@New => () +</%ARGS> +<%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; +</%INIT> +</%METHOD> diff --git a/rt/share/html/Search/Elements/EditSearches b/rt/share/html/Search/Elements/EditSearches new file mode 100644 index 000000000..08f84c70c --- /dev/null +++ b/rt/share/html/Search/Elements/EditSearches @@ -0,0 +1,322 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +%# <sales@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +%# 02110-1301 or visit their web page on the internet at +%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +<&| /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 : '' &> +<br /> +<&|/l&>Description</&>: +<input size="25" name="SavedSearchDescription" value="<% $Description || '' %>" /> + +% if ($Id ne 'new') { +<nobr> +% if ( $Dirty ) { +<input type="submit" class="button" name="SavedSearchRevert" value="<%loc('Revert')%>" /> +% } +<input type="submit" class="button" name="SavedSearchDelete" value="<%loc('Delete')%>" /> +% if ( $AllowCopy ) { +<input type="submit" class="button" name="SavedSearchCopy" value="<%loc('Save as New')%>" /> +% } +</nobr> +% } +% if ( $Object && $Object->Id ) { +<input type="submit" class="button" name="SavedSearchSave" value="<%loc('Update')%>" /> +% } else { +<input type="submit" class="button" name="SavedSearchSave" value="<%loc('Save')%>" /> +%} +% } +<br /> +<hr /> +<&|/l&>Load saved search:</&> +<& SelectSearchesForObjects, Name => 'SavedSearchLoad', Objects => \@Objects, SearchType => $Type &> +<input type="submit" value="<% loc('Load') %>" class="button" /> + +</&> + +<%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, +); + +</%INIT> + +<%ARGS> +$Id => 'new' +$Object => undef +$Type => 'Ticket' +$Description => '' +$CurrentSearch => {} +@SearchFields => () +$AllowCopy => 1 +$Title => loc('Saved searches') +</%ARGS> + +<%METHOD Init> +<%ARGS> +$Query => {} +$SavedSearch => {} +@SearchFields => qw(Query Format OrderBy Order RowsPerPage) +</%ARGS> +<%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... + my ($val, $msg) = $container->Attributes->DeleteEntry( Name => 'SavedSearch', id => $id ); + unless ( $val ) { + push @results, $msg; + return @results; + } + } + $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; + +</%INIT> +</%METHOD> + +<%METHOD Save> +<%ARGS> +$Query => {} +$SavedSearch => {} +@SearchFields => qw(Query Format OrderBy Order RowsPerPage) +</%ARGS> +<%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); + + # we need to check right before we change any of ObjectType and ObjectId, + # or it will fail the 2nd change if we use SetObjectType and + # SetObjectId sequentially + + if ( $obj->CurrentUserHasRight('update') ) { + if ( $new_obj_type ne $obj_type ) { + ( $val, $msg ) = $obj->__Set( + Field => 'ObjectType', + Value => $new_obj_type, + ); + push @results, loc( 'Unable to set privacy object: [_1]', $msg ) + unless ($val); + } + if ( $new_obj_id != $obj_id ) { + ( $val, $msg ) = $obj->__Set( + Field => 'ObjectId', + Value => $new_obj_id, + ); + push @results, loc( 'Unable to set privacy id: [_1]', $msg ) + unless ($val); + } + } + else { + # two loc are just for convenience so we don't need to + # write an extra i18n translation item + push @results, + loc( 'Unable to set privacy object or id: [_1]', + loc('Permission Denied') ) + } + } 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; + +</%INIT> +</%METHOD> diff --git a/rt/share/html/Search/Elements/Graph b/rt/share/html/Search/Elements/Graph new file mode 100644 index 000000000..1cf1f1baa --- /dev/null +++ b/rt/share/html/Search/Elements/Graph @@ -0,0 +1,50 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +%# <sales@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +%# 02110-1301 or visit their web page on the internet at +%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +<%INIT> +return $m->comp('/Ticket/Graphs/Elements/ShowGraph', %ARGS); +</%INIT> diff --git a/rt/share/html/Search/Elements/NewListActions b/rt/share/html/Search/Elements/NewListActions new file mode 100644 index 000000000..8c7846a19 --- /dev/null +++ b/rt/share/html/Search/Elements/NewListActions @@ -0,0 +1,66 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +%# <sales@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +%# 02110-1301 or visit their web page on the internet at +%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +<b><%loc('Results')%></b><br /> +% foreach my $action (@actions) { +% my @item = @$action; +% if ($item[1] < 0) { +<font color="red"> +% } + <%$item[0]%><br /> +% if ($item[1] < 0) { +</font> +% } +% } +<br /> +<%init> +@actions = map ref $_? $_: [$_, 0], grep defined && length, @actions; +return unless @actions; +</%init> +<%ARGS> +@actions => undef +</%ARGS> diff --git a/rt/share/html/Search/Elements/PickBasics b/rt/share/html/Search/Elements/PickBasics new file mode 100644 index 000000000..b03fc15d5 --- /dev/null +++ b/rt/share/html/Search/Elements/PickBasics @@ -0,0 +1,214 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +%# <sales@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +%# 02110-1301 or visit their web page on the internet at +%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +% 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 ); + +</%INIT> diff --git a/rt/share/html/Search/Elements/PickCFs b/rt/share/html/Search/Elements/PickCFs new file mode 100644 index 000000000..9abab4443 --- /dev/null +++ b/rt/share/html/Search/Elements/PickCFs @@ -0,0 +1,125 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +%# <sales@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +%# 02110-1301 or visit their web page on the internet at +%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +% 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; + + # Op + if ($CustomField->Type eq 'Date') { + $line{'Op'} = { + Type => 'component', + Path => '/Elements/SelectDateRelation', + Arguments => {}, + }; + } else { + $line{'Op'} = { + Type => 'component', + Path => '/Elements/SelectCustomFieldOperator', + Arguments => { True => loc("is"), + False => loc("isn't"), + TrueVal=> '=', + FalseVal => '!=', + }, + }; + } + + # Value + if ($CustomField->Type eq 'Date') { + $line{'Value'} = { + Type => 'component', + Path => '/Elements/SelectDate', + Arguments => {}, + }; + } else { + $line{'Value'} = { + Type => 'component', + Path => '/Elements/SelectCustomFieldValue', + Arguments => { CustomField => $CustomField }, + }; + } + + push @lines, \%line; +} + +$m->callback( Conditions => \@lines, Queues => \%cfqueues ); + +</%INIT> + +<%ARGS> +%cfqueues => undef +</%ARGS> diff --git a/rt/share/html/Search/Elements/PickCriteria b/rt/share/html/Search/Elements/PickCriteria new file mode 100644 index 000000000..44e3b7037 --- /dev/null +++ b/rt/share/html/Search/Elements/PickCriteria @@ -0,0 +1,72 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +%# <sales@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +%# 02110-1301 or visit their web page on the internet at +%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +<&| /Widgets/TitleBox, title => loc('Add Criteria')&> + +<table width="100%" cellspacing="0" cellpadding="0" border="0"> + + + +<& PickBasics &> +<& PickCFs, cfqueues => \%cfqueues &> + +<tr class="separator"><td colspan="3"><hr /></td></tr> +<tr> +<td class="label"><&|/l&>Aggregator</&></td> +<td class="operator" colspan="2"><& SelectAndOr, Name => "AndOr" &></td> + +</tr> + +</table> + +</&> + +<%ARGS> +$addquery => 0 +$query => undef +%cfqueues => undef +</%ARGS> diff --git a/rt/share/html/Search/Elements/ResultViews b/rt/share/html/Search/Elements/ResultViews new file mode 100644 index 000000000..9ddbd1359 --- /dev/null +++ b/rt/share/html/Search/Elements/ResultViews @@ -0,0 +1,82 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +%# <sales@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +%# 02110-1301 or visit their web page on the internet at +%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +<%args> +$QueryString => undef +$Query => undef +$Format => undef +$Rows => undef +$OrderBy => undef +$Order => undef +$RSSFeedURL => undef +$ShortQueryString => undef + +</%args> +<ul class="search-result-views"> +<li><a href="<%$RSSFeedURL%>"><&|/l&>RSS</&></a></li> +<li><a href="<%RT->Config->Get('WebURL')%>/NoAuth/iCal/<% $ical_path %>"><% loc('iCal') %></a></li> +<li><a href="<%RT->Config->Get('WebPath')%>/Tools/Offline.html<%$ShortQueryString%>"><&|/l&>Editable text</&></a></li> +<li><a href="<%RT->Config->Get('WebPath')%>/Search/Results.tsv<%$QueryString%>"><&|/l&>TSV</&></a></li> +<li><a href="<%RT->Config->Get('WebPath')%>/Search/Results.csv<%$QueryString%>"><&|/l&>CSV</&></a></li> +<li><a href="<%RT->Config->Get('WebPath')%>/Search/Results.xls<%$QueryString%>"><&|/l&>XLS</&></a></li> +% # Now let callbacks add their extra tools +% $m->callback( %ARGS, CallbackName => 'AfterTools' ); +</ul> +<form method="get" action="<%RT->Config->Get('WebPath')%>/Search/Chart.html"> +% my %hiddens = (Query => $Query, Format => $Format, Rows => $Rows, OrderBy => $OrderBy, Order => $Order); +% foreach my $key (keys(%hiddens)) { +<input type="hidden" class="hidden" name="<%$key%>" value="<%defined($hiddens{$key})?$hiddens{$key}:''%>" /> +% } +<&|/l, $m->scomp('SelectChartType', Name => 'ChartStyle'), $m->scomp('SelectGroupBy', Name => 'PrimaryGroupBy', Query => $Query) +&>[_1] chart by [_2]</&><input type="submit" class="button" value="<%loc('Go')%>" /> +</form> +<%init> +my $ical_path = join '/', map $m->interp->apply_escapes($_, 'u'), + $session{'CurrentUser'}->UserObj->Name, + $session{'CurrentUser'}->UserObj->GenerateAuthString( $Query ), + $Query; +</%init> diff --git a/rt/share/html/Search/Elements/ResultsRSSView b/rt/share/html/Search/Elements/ResultsRSSView new file mode 100644 index 000000000..f3b416a4e --- /dev/null +++ b/rt/share/html/Search/Elements/ResultsRSSView @@ -0,0 +1,143 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +%# <sales@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +%# 02110-1301 or visit their web page on the internet at +%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +<%INIT> +use Encode (); + +my $old_current_user; + +if ( $m->request_comp->path =~ RT->Config->Get('WebNoAuthRegex') ) { + my $path = $m->dhandler_arg; + + my $notfound = sub { + my $mesg = shift; + $r->headers_out->{'Status'} = '404 Not Found'; + $RT::Logger->info("Error encountered in rss generation: $mesg"); + $m->clear_and_abort; + }; + + $notfound->("Invalid path: $path") unless $path =~ m!^([^/]+)/([^/]+)/?!; + + my ( $name, $auth ) = ( $1, $2 ); + + # Unescape parts + $name =~ s/\%([0-9a-z]{2})/chr(hex($1))/gei; + + # convert to perl strings + $name = Encode::decode_utf8($name); + + my $user = RT::User->new($RT::SystemUser); + $user->Load($name); + $notfound->("Invalid user: $user") unless $user->id; + + $notfound->("Invalid authstring") + unless $user->ValidateAuthString( $auth, + $ARGS{Query} . $ARGS{Order} . $ARGS{OrderBy} ); + + $old_current_user = $session{'CurrentUser'}; + my $cu = RT::CurrentUser->new; + $cu->Load($user); + $session{'CurrentUser'} = $cu; +} + +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); +$session{'CurrentUser'} = $old_current_user if $old_current_user; +$m->abort(); +</%INIT> +<%ARGS> +$OrderBy => 'Created' +$Order => 'ASC' +</%ARGS> + diff --git a/rt/share/html/Search/Elements/ResultsStructuredView b/rt/share/html/Search/Elements/ResultsStructuredView new file mode 100644 index 000000000..495f0d0c8 --- /dev/null +++ b/rt/share/html/Search/Elements/ResultsStructuredView @@ -0,0 +1,173 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC +%# <jesse@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +%# 02110-1301 or visit their web page on the internet at +%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +<%ARGS> +$Query => undef +$OrderBy => 'id' +$Order => 'ASC' +$Format => undef + +#Callbacks +$WriteHeader => sub { $RT::Logger->error('WriteHeader callback required'); '' } +$WriteRow => sub { $RT::Logger->error('WriteRow callback required'); '' } +$FormatDate => sub { $_[0]->AsString } +</%ARGS> +<%INIT> + +use HTML::TreeBuilder; +use HTML::FormatText; + +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 ); +} + +# Convert the format string to column info +$Format = $m->comp('/Elements/ScrubHTML', Content => $Format); +my @Format = $m->comp('/Elements/CollectionAsTable/ParseFormat', + Format => $Format); + +# Generate the header row +my $item = 0; +my @header; +foreach my $column (@Format) { +# see /Element/CollectionAsTable/Header + my $title = $column->{'title'} || ''; + if ( $title eq 'NEWLINE' ) { + # ignore these for now + undef $column; + next; + } + $title = '' if $title eq 'NBSP'; + + if ( !defined $column->{'title'} ) { + my $attr = $column->{'attribute'} || $column->{'last_attribute'}; + my $tmp = $m->comp( '/Elements/ColumnMap', + Class => 'RT__Ticket', + Name => $attr, + Attr => 'title' + ); + $title = ProcessColumnMapValue($tmp, Arguments => [ $attr ]); + } + + push @header, $title; + +} #foreach $column + +&{ $WriteHeader }(@header); + +my $plaintext = HTML::FormatText->new; +my $row = 1; +my $ColumnMap = {}; +while ( my $Ticket = $Tickets->Next()) { + my $height = 0; + my @row = (); + foreach my $column ( @Format ) { + next if !defined $column; + + my $value = ''; + my @out; + # Ignore almost all formatting here. + foreach my $subcol ( @{ $column->{output} } ) { + my ($col) = ($subcol =~ /^__(.*?)__$/ ); + + if ( !$col ) { + push @out, $subcol; + next; + } + + if ( !exists $ColumnMap->{$col}{'value'} ) { + my $map = {}; + foreach ('attribute', 'value', 'date') { + $map->{$_} = $m->comp( + '/Elements/ColumnMap', + Class => 'RT__Ticket', + Name => $col, + Attr => $_, + ); + } + # Canonicalize dates + if ( defined $map->{'date'} ) { + $map->{value} = sub { + my $DateObj = $map->{'date'}->(@_) or return undef; + $FormatDate->($DateObj); + }; + } + $ColumnMap->{$col} = $map; + } + + push @out, ProcessColumnMapValue( + $ColumnMap->{$col}{'value'}, + Arguments => [ $Ticket, $row ], + ); + } #foreach $subcol + $value = join('', '<span>', @out, '</span>'); + # strip out all HTML except line breaks + my $tree = HTML::TreeBuilder->new->parse($value); + my $text = $plaintext->format($tree); + # along with leading/trailing whitespace + my @lines = map { s/^\s*//; s/\s*$//; $_ } split("\n", $text); + + # then provide separate lines to the callback + push @row, \@lines; + } #foreach $column + + &{ $WriteRow }(@row); + +} # while $Tickets->Next + +</%INIT> diff --git a/rt/share/html/Search/Elements/SearchPrivacy b/rt/share/html/Search/Elements/SearchPrivacy new file mode 100644 index 000000000..f943af143 --- /dev/null +++ b/rt/share/html/Search/Elements/SearchPrivacy @@ -0,0 +1,61 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +%# <sales@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +%# 02110-1301 or visit their web page on the internet at +%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +<%args> +$Object => undef +</%args> +<%init> +my $label; +if (ref($Object) eq 'RT::User') { + $label = $Object->id == $session{'CurrentUser'}->Id + ? loc("My saved searches") + : loc("[_1]'s saved searches", $m->scomp('/Elements/ShowUser', User => $Object)); +} else { + $label = loc("[_1]'s saved searches", $m->interp->apply_escapes($Object->Name, 'h')); +} +</%init> +<% $label |n %>\ diff --git a/rt/share/html/Search/Elements/SearchesForObject b/rt/share/html/Search/Elements/SearchesForObject new file mode 100644 index 000000000..35007bde5 --- /dev/null +++ b/rt/share/html/Search/Elements/SearchesForObject @@ -0,0 +1,65 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +%# <sales@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +%# 02110-1301 or visit their web page on the internet at +%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +<%args> +$Object => undef +</%args> +<%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; +</%init> diff --git a/rt/share/html/Search/Elements/SelectAndOr b/rt/share/html/Search/Elements/SelectAndOr new file mode 100644 index 000000000..a644a71d8 --- /dev/null +++ b/rt/share/html/Search/Elements/SelectAndOr @@ -0,0 +1,53 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +%# <sales@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +%# 02110-1301 or visit their web page on the internet at +%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +<input type="radio" class="radio" name="<%$Name%>" checked="checked" value="AND" /><&|/l&>AND</&> +<input type="radio" class="radio" name="<%$Name%>" value="OR" /><&|/l&>OR</&> + +<%ARGS> +$Name => "Operator" +</%ARGS> diff --git a/rt/share/html/Search/Elements/SelectChartType b/rt/share/html/Search/Elements/SelectChartType new file mode 100644 index 000000000..da4cbfa62 --- /dev/null +++ b/rt/share/html/Search/Elements/SelectChartType @@ -0,0 +1,58 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +%# <sales@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +%# 02110-1301 or visit their web page on the internet at +%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +<%args> +$Name => 'ChartType' +$Default => 'bar' +</%args> +<select id="<%$Name%>" name="<%$Name%>"> +% foreach my $option qw(bar pie) { +% # 'bar' # loc +% # 'pie' # loc +<option value="<%$option%>"<% $option eq $Default ? qq[ selected="selected"] : '' |n %>><%loc($option)%></option> +% } +</select> diff --git a/rt/share/html/Search/Elements/SelectGroup b/rt/share/html/Search/Elements/SelectGroup new file mode 100644 index 000000000..2ed965d42 --- /dev/null +++ b/rt/share/html/Search/Elements/SelectGroup @@ -0,0 +1,67 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +%# <sales@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +%# 02110-1301 or visit their web page on the internet at +%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +<select id="<%$Name%>" name="<%$Name%>"> +% if ($AllowNull) { +<option value="">-</option> +% } +%while (my $group = $groups->Next) { +<option value="<%$group->id%>"<%$group->id eq $Default && qq[ selected="selected"] |n %>><%$group->Name%></option> +%} +</select> + +<%INIT> +my $groups = new RT::Groups($session{'CurrentUser'}); +$groups->Limit(FIELD => 'Domain', OPERATOR => '=', VALUE => $Domain); + +</%INIT> +<%ARGS> +$AllowNull => 1 +$Default=> '' +$Name => 'Group' +$Domain => 'UserDefined'; +</%ARGS> diff --git a/rt/share/html/Search/Elements/SelectGroupBy b/rt/share/html/Search/Elements/SelectGroupBy new file mode 100644 index 000000000..fbf19addb --- /dev/null +++ b/rt/share/html/Search/Elements/SelectGroupBy @@ -0,0 +1,63 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +%# <sales@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +%# 02110-1301 or visit their web page on the internet at +%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +<%args> +$Name => 'GroupBy' +$Default => 'Status' +$Query => '' +</%args> +<select id="<% $Name %>" name="<% $Name %>"> +% while (@options) { +% my ($text, $value) = (shift @options, shift @options); +<option value="<% $value %>" <% $value eq $Default ? 'selected="selected"' : '' |n%>><% loc($text) %></option> +% } +</select> +<%init> +use RT::Report::Tickets; +my $report = RT::Report::Tickets->new( $session{'CurrentUser'} ); +my @options = $report->Groupings( Query => $Query ); +</%init> diff --git a/rt/share/html/Search/Elements/SelectLinks b/rt/share/html/Search/Elements/SelectLinks new file mode 100644 index 000000000..20c0dd311 --- /dev/null +++ b/rt/share/html/Search/Elements/SelectLinks @@ -0,0 +1,66 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +%# <sales@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +%# 02110-1301 or visit their web page on the internet at +%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +<select name="<%$Name%>"> +% foreach (@fields) { +<option value="<%$_%>"><% loc($_) %></option> +% } +</select> +<%ARGS> +$Name => 'LinksField' +</%ARGS> + +<%INIT> +my @fields = ('HasMember', + 'MemberOf', + 'DependsOn', + 'DependedOnBy', + 'RefersTo', + 'ReferredToBy', + 'LinkedTo', + ); +</%INIT> diff --git a/rt/share/html/Search/Elements/SelectPersonType b/rt/share/html/Search/Elements/SelectPersonType new file mode 100644 index 000000000..6454acff3 --- /dev/null +++ b/rt/share/html/Search/Elements/SelectPersonType @@ -0,0 +1,84 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +%# <sales@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +%# 02110-1301 or visit their web page on the internet at +%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +<select id="<%$Name%>" name="<%$Name%>"> +% if ($AllowNull) { +<option value="">-</option> +% } +% for my $option (@types) { +% if ($Suffix) { +<option value="<% $option %><% $Suffix %>"<%$option eq $Default && qq[ selected="selected"] |n %> ><%loc($option)%></option> +% next; +% } +% foreach my $subtype (@subtypes) { +<option value="<%"$option.$subtype"%>"<%$option eq $Default && $subtype eq 'EmailAddress' && qq[ selected="selected"] |n %> ><% loc($option) %> <% loc($subtype) %></option> +% } +% } +</select> + +<%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 = @{ $RT::Tickets::SEARCHABLE_SUBFIELDS{'User'} }; + +</%INIT> +<%ARGS> +$AllowNull => 1 +$Suffix => '' +$Default=>undef +$Scope => 'ticket' +$Name => 'WatcherType' +</%ARGS> diff --git a/rt/share/html/Search/Elements/SelectSearchObject b/rt/share/html/Search/Elements/SelectSearchObject new file mode 100644 index 000000000..d1b38abf0 --- /dev/null +++ b/rt/share/html/Search/Elements/SelectSearchObject @@ -0,0 +1,64 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +%# <sales@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +%# 02110-1301 or visit their web page on the internet at +%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +<%args> +@Objects => undef +$Name => undef +$Object => undef +</%args> +<%init> +my $default_privacy = ''; +if ( $Object && $Object->Id ) { + $default_privacy = ref($Object).'-'.$Object->Id; +} +</%init> +<select id="<%$Name%>" name="<%$Name%>"> +% foreach my $object (@Objects) { +% my $privacy = ref($object).'-'.$object->id; +<option value="<%$privacy%>" <% ( $privacy eq $default_privacy ) ? "selected='selected'" : '' |n %>><& SearchPrivacy, Object => $object &></option> +% } +</select> diff --git a/rt/share/html/Search/Elements/SelectSearchesForObjects b/rt/share/html/Search/Elements/SelectSearchesForObjects new file mode 100644 index 000000000..eafe88843 --- /dev/null +++ b/rt/share/html/Search/Elements/SelectSearchesForObjects @@ -0,0 +1,66 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2011 Best Practical Solutions, LLC +%# <sales@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +%# 02110-1301 or visit their web page on the internet at +%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +<%args> +@Objects => undef +$Name => undef +$SearchType => 'Ticket', +</%args> +<select id="<%$Name%>" name="<%$Name%>"> +<option value="" selected> </option> +% foreach my $object (@Objects) { +<optgroup label="<& SearchPrivacy, Object => $object &>"> +% my @searches = $object->Attributes->Named('SavedSearch'); +% foreach my $search (@searches) { +% # Skip it if it is not of search type we want. +% next if ($search->SubValue('SearchType') +% && $search->SubValue('SearchType') ne $SearchType); +<option value="<%ref($object)%>-<%$object->id%>-SavedSearch-<%$search->Id%>"><%$search->Description||loc('Unnamed search')%></option> +% } +</optgroup> +% } +</select> |
