diff --git a/Netdisco/lib/App/Netdisco/Web/Plugin/Search/Port.pm b/Netdisco/lib/App/Netdisco/Web/Plugin/Search/Port.pm index c32e926f..eb1c38fb 100644 --- a/Netdisco/lib/App/Netdisco/Web/Plugin/Search/Port.pm +++ b/Netdisco/lib/App/Netdisco/Web/Plugin/Search/Port.pm @@ -7,39 +7,57 @@ use Dancer::Plugin::Auth::Extensible; use App::Netdisco::Web::Plugin; use App::Netdisco::Util::Web 'sql_match'; -register_search_tab({ tag => 'port', label => 'Port', provides_csv => 1 }); +register_search_tab( { tag => 'port', label => 'Port', provides_csv => 1 } ); # device ports with a description (er, name) matching get '/ajax/content/search/port' => require_login sub { my $q = param('q'); - send_error('Missing query', 400) unless $q; - my $set; + send_error( 'Missing query', 400 ) unless $q; + my $rs; - if ($q =~ m/^\d+$/) { - $set = schema('netdisco')->resultset('DevicePort') - ->search({vlan => $q}); + if ( $q =~ m/^\d+$/ ) { + $rs + = schema('netdisco')->resultset('DevicePort') + ->columns( [qw/ ip port name descr /] )->search( + { "port_vlans.vlan" => $q }, + { '+columns' => [qw/ device.dns device.name port_vlans.vlan /], + join => [qw/ port_vlans device /] + } + ); } else { - my ($likeval, $likeclause) = sql_match($q); + my ( $likeval, $likeclause ) = sql_match($q); - $set = schema('netdisco')->resultset('DevicePort') - ->search({-or => [ - {name => (param('partial') ? $likeclause : $q)}, - (length $q == 17 ? {mac => $q} - : \['mac::text ILIKE ?', $likeval]), - ]}); + $rs + = schema('netdisco')->resultset('DevicePort') + ->columns( [qw/ ip port name descr /] )->search( + { -or => [ + { "me.name" => ( param('partial') ? $likeclause : $q ) }, + ( length $q == 17 + ? { "me.mac" => $q } + : \[ 'me.mac::text ILIKE ?', $likeval ] + ), + ] + }, + { '+columns' => [qw/ device.dns device.name port_vlans.vlan /], + join => [qw/ port_vlans device /] + } + ); } - return unless $set->count; - if (request->is_ajax) { - template 'ajax/search/port.tt', {results => $set}, - { layout => undef }; + my @results = $rs->hri->all; + return unless scalar @results; + + if ( request->is_ajax ) { + my $json = to_json( \@results ); + template 'ajax/search/port.tt', { results => $json }, + { layout => undef }; } else { header( 'Content-Type' => 'text/comma-separated-values' ); - template 'ajax/search/port_csv.tt', {results => $set}, - { layout => undef }; + template 'ajax/search/port_csv.tt', { results => \@results }, + { layout => undef }; } }; -true; +1; diff --git a/Netdisco/share/views/ajax/search/port.tt b/Netdisco/share/views/ajax/search/port.tt index 3266cd7a..a43eb9bb 100644 --- a/Netdisco/share/views/ajax/search/port.tt +++ b/Netdisco/share/views/ajax/search/port.tt @@ -1,23 +1,45 @@ -
| Description | -Port | Name | +Port | +Description | Vlan |
|---|---|---|---|---|---|
| [% row.name | html_entity %] | -- [% row.ip | html_entity %] [ [% row.port | html_entity %] ] - [% ' (' _ row.device.dns _ ')' IF row.device.dns %] - | -[% row.descr | html_entity %] | -[% row.vlan | html_entity %] | -