diff --git a/Netdisco/lib/Netdisco/DB/ResultSet/DevicePort.pm b/Netdisco/lib/Netdisco/DB/ResultSet/DevicePort.pm index 254d0dba..f4ded9bc 100644 --- a/Netdisco/lib/Netdisco/DB/ResultSet/DevicePort.pm +++ b/Netdisco/lib/Netdisco/DB/ResultSet/DevicePort.pm @@ -61,5 +61,22 @@ sub by_name { ); } +# should match edge ports only +sub by_vlan { + my ($set, $vlan) = @_; + return $set unless $vlan and $vlan =~ m/^\d+$/;; + + return $set->search( + { + 'me.vlan' => $vlan, + }, + { + order_by => [qw/ me.ip me.port /], + columns => [qw/ ip port descr name vlan device.dns /], + join => 'device', + }, + ); +} + 1; diff --git a/Netdisco/lib/Netdisco/Web.pm b/Netdisco/lib/Netdisco/Web.pm index f5df4d44..a260b7c2 100644 --- a/Netdisco/lib/Netdisco/Web.pm +++ b/Netdisco/lib/Netdisco/Web.pm @@ -234,10 +234,16 @@ ajax '/ajax/content/search/vlan' => sub { # device ports with a description (er, name) matching ajax '/ajax/content/search/port' => sub { - my $name = param('q'); - return unless $name; + my $q = param('q'); + return unless $q; + my $set; - my $set = schema('netdisco')->resultset('DevicePort')->by_name($name); + if ($q =~ m/^\d+$/) { + $set = schema('netdisco')->resultset('DevicePort')->by_vlan($q); + } + else { + $set = schema('netdisco')->resultset('DevicePort')->by_name($q); + } return unless $set->count; content_type('text/html'); diff --git a/Netdisco/views/ajax/device/ports.tt b/Netdisco/views/ajax/device/ports.tt index b83cb5e3..e45de8d7 100644 --- a/Netdisco/views/ajax/device/ports.tt +++ b/Netdisco/views/ajax/device/ports.tt @@ -14,13 +14,13 @@ [% IF row.up_admin == 'down' %] - s + s [% ELSIF row.stp == 'blocking' %] - b + b [% ELSIF row.is_free(params.age_num, params.age_unit) %] - f + f [% ELSIF row.up_admin == 'up' AND row.up == 'down' %] - d + d [% END %] [% IF params.c_port %]