diff --git a/Netdisco/lib/Netdisco/DB/ResultSet/Device.pm b/Netdisco/lib/Netdisco/DB/ResultSet/Device.pm index 6dc34a53..fefb7efb 100644 --- a/Netdisco/lib/Netdisco/DB/ResultSet/Device.pm +++ b/Netdisco/lib/Netdisco/DB/ResultSet/Device.pm @@ -110,4 +110,21 @@ sub carrying_vlan { ); } +sub carrying_vlan_name { + my ($set, $name) = @_; + return $set unless $name; + $name = "\%$name\%" if $name !~ m/\%/; + + return $set->search( + { + 'vlans.description' => { '-ilike' => $name }, + }, + { + order_by => [qw/ me.dns me.ip /], + columns => [qw/ me.ip me.dns me.model me.os me.vendor /], + prefetch => 'vlans', + }, + ); +} + 1; diff --git a/Netdisco/lib/Netdisco/Web.pm b/Netdisco/lib/Netdisco/Web.pm index fdc5519a..fced281b 100644 --- a/Netdisco/lib/Netdisco/Web.pm +++ b/Netdisco/lib/Netdisco/Web.pm @@ -30,17 +30,6 @@ hook 'before' => sub { var('query_defaults' => { map { ($_ => "tab=$_") } qw/node/ }); var('query_defaults')->{node} .= "\&$_=". (param($_) || '') for qw/stamps vendor archived partial/; - - # set up property lists for device search - var('model_list' => [ - schema('netdisco')->resultset('Device')->get_distinct('model') - ]); - var('os_ver_list' => [ - schema('netdisco')->resultset('Device')->get_distinct('os_ver') - ]); - var('vendor_list' => [ - schema('netdisco')->resultset('Device')->get_distinct('vendor') - ]); }; # device with various properties or a default match-all @@ -50,16 +39,15 @@ ajax '/ajax/content/search/device' => sub { my $set; if ($has_opt) { - $set = schema('netdisco')->resultset('Device')->by_field(scalar params); - return unless $set->count; + $set = schema('netdisco')->resultset('Device')->by_field(scalar params); } else { - my $q = param('q'); - return unless $q; + my $q = param('q'); + return unless $q; - $set = schema('netdisco')->resultset('Device')->by_any($q); - return unless $set->count; + $set = schema('netdisco')->resultset('Device')->by_any($q); } + return unless $set->count; content_type('text/html'); template 'ajax/device.tt', { @@ -99,14 +87,13 @@ ajax '/ajax/content/search/node' => sub { # by_ip() will extract cidr notation if necessary $set = schema('netdisco')->resultset('NodeIp') ->by_ip(param('archived'), $ip); - return unless $set->count; } else { $node = "\%$node\%" if param('partial'); $set = schema('netdisco')->resultset('NodeIp') ->by_name(param('archived'), $node); - return unless $set->count; } + return unless $set->count; template 'ajax/node_by_ip.tt', { results => $set, @@ -117,9 +104,15 @@ ajax '/ajax/content/search/node' => sub { # devices carrying vlan xxx ajax '/ajax/content/search/vlan' => sub { my $vlan = param('q'); - return unless $vlan and $vlan =~ m/^\d+$/; + return unless $vlan; + my $set; - my $set = schema('netdisco')->resultset('Device')->carrying_vlan($vlan); + if ($vlan =~ m/^\d+$/) { + $set = schema('netdisco')->resultset('Device')->carrying_vlan($vlan); + } + else { + $set = schema('netdisco')->resultset('Device')->carrying_vlan_name($vlan); + } return unless $set->count; content_type('text/html'); @@ -147,6 +140,17 @@ get '/' => sub { }; get '/search' => sub { + # set up property lists for device search + var('model_list' => [ + schema('netdisco')->resultset('Device')->get_distinct('model') + ]); + var('os_ver_list' => [ + schema('netdisco')->resultset('Device')->get_distinct('os_ver') + ]); + var('vendor_list' => [ + schema('netdisco')->resultset('Device')->get_distinct('vendor') + ]); + my $q = param('q'); if ($q and not param('tab')) { # pick most likely tab for initial results diff --git a/Netdisco/views/ajax/device.tt b/Netdisco/views/ajax/device.tt index 7b31c6d0..28b3f3b3 100644 --- a/Netdisco/views/ajax/device.tt +++ b/Netdisco/views/ajax/device.tt @@ -14,7 +14,7 @@ [% WHILE (row = results.next) %]
| Vlan | Device | Description | Model | @@ -11,16 +12,18 @@ [% WHILE (row = results.next) %]||
|---|---|---|---|---|---|
| [% row.vlan.vlan %] | [% row.dns %] | + href="/device?ip=[% row.ip %]&vlan=[% row.vlan.vlan %]">[% row.dns %][% row.vlan.description %] | + href="/device?ip=[% row.ip %]&vlan=[% row.vlan.vlan %]">[% row.vlan.description %][% row.model %] | + href="/device?ip=[% row.ip %]&vlan=[% row.vlan.vlan %]">[% row.model %][% row.os %] | + href="/device?ip=[% row.ip %]&vlan=[% row.vlan.vlan %]">[% row.os %][% row.vendor %] | + href="/device?ip=[% row.ip %]&vlan=[% row.vlan.vlan %]">[% row.vendor %]