<%ARGS>
$Path
$ARGSRef
</%ARGS>
<%INIT>
# replace Search -> Assets with a submenu (if the user has ShowAssetsMenu)
if (my $search_assets = Menu()->child("search")->child("assets")) {
$search_assets->path('/Asset/Search/Build.html?NewQuery=1');
if (!RT->Config->Get('AssetSQL_HideSimpleSearch')) {
$search_assets->child("asset_simple", title => loc("Simple Search"), path => "/Asset/Search/");
$search_assets->child("assetsql", title => loc("New Search"), path => "/Asset/Search/Build.html?NewQuery=1");
}
}
# add Assets -> New Search (if the user has ShowAssetsMenu)
if (Menu()->child("assets") && (my $assets_search = Menu()->child("assets")->child("search"))) {
if (RT->Config->Get('AssetSQL_HideSimpleSearch')) {
$assets_search->path("/Asset/Search/Build.html?NewQuery=1");
}
else {
$assets_search->title(loc("Simple Search"));
$assets_search->add_before("assetsql", title => loc("New Search"), path => "/Asset/Search/Build.html?NewQuery=1");
}
}
my $query_string = sub {
my %args = @_;
my $u = URI->new();
$u->query_form(map { $_ => $args{$_} } sort keys %args);
return $u->query || '';
};
my $page = PageMenu();
if ($Path =~ m{^/Asset/Search/(index.html)?$}) {
# no action needed; just here for the elsif
}
elsif ($Path =~ m{^/Asset/Search/}) {
my %search = map @{$_},
grep defined $_->[1] && length $_->[1],
map {ref $DECODED_ARGS->{$_} ? [$_, $DECODED_ARGS->{$_}[0]] : [$_, $DECODED_ARGS->{$_}] }
grep /^(?:q|SearchAssets|!?(Name|Description|Catalog|Status|Role\..+|CF\..+)|Order(?:By)?|Page)$/,
keys %$DECODED_ARGS;
my $current_search = $session{"CurrentAssetSearchHash"} || {};
my $search_id = $DECODED_ARGS->{'SavedSearchLoad'} || $DECODED_ARGS->{'SavedSearchId'} || $current_search->{'SearchId'} || '';
my $args = '';
my $has_query;
$has_query = 1 if ( $DECODED_ARGS->{'Query'} or $current_search->{'Query'} );
my %query_args;
my %fallback_query_args = (
SavedSearchId => ( $search_id eq 'new' ) ? undef : $search_id,
(
map {
my $p = $_;
$p => $DECODED_ARGS->{$p} || $current_search->{$p}
} qw(Query Format OrderBy Order Page)
),
RowsPerPage => (
defined $DECODED_ARGS->{'RowsPerPage'}
? $DECODED_ARGS->{'RowsPerPage'}
: $current_search->{'RowsPerPage'}
),
);
my $QueryString = $ARGSRef->{QueryString};
my $QueryArgs = $ARGSRef->{QueryArgs};
if ($QueryString) {
$args = '?' . $QueryString;
}
else {
my %final_query_args = ();
# key => callback to avoid unnecessary work
for my $param (keys %fallback_query_args) {
$final_query_args{$param} = defined($QueryArgs->{$param})
? $QueryArgs->{$param}
: $fallback_query_args{$param};
}
for my $field (qw(Order OrderBy)) {
if ( ref( $final_query_args{$field} ) eq 'ARRAY' ) {
$final_query_args{$field} = join( "|", @{ $final_query_args{$field} } );
} elsif (not defined $final_query_args{$field}) {
delete $final_query_args{$field};
}
else {
$final_query_args{$field} ||= '';
}
}
$args = '?' . $query_string->(%final_query_args);
}
$page->child('edit_search',
title => loc('Edit Search'),
path => '/Asset/Search/Build.html' . $args,
sort_order => 1,
);
$page->child( advanced => title => loc('Advanced'), path => '/Asset/Search/Edit.html' . $args, sort_order => 2 );
if ($has_query) {
# these overwrite the core Asset menu items
$page->child( results => title => loc('Show Results'), path => '/Asset/Search/Results.html' . $args, sort_order => 3 );
$page->child('bulk',
title => loc('Bulk Update'),
path => '/Asset/Search/Bulk.html' . $args,
sort_order => 4,
);
$page->child('csv',
title => loc('Download Spreadsheet'),
path => '/Asset/Search/Results.tsv' . $args,
sort_order => 5,
);
}
}
elsif ( $Path =~ m{^/Ticket/} && $session{CurrentUser}->HasRight( Right => 'ShowAssetsMenu', Object => RT->System) ) {
if ( ( $DECODED_ARGS->{'id'} || '' ) =~ /^(\d+)$/ ) {
my $id = $1;
my $obj = RT::Ticket->new( $session{'CurrentUser'} );
$obj->Load($id);
if ( $obj and $obj->id && $obj->CurrentUserHasRight('ModifyTicket')) {
$page->child('actions')->child( edit_assets => title => loc('Edit Assets'), path => "/Asset/Search/Bulk.html?Query=Linked=" . $id );
}
}
}
</%INIT>