diff --git a/MANIFEST b/MANIFEST
index 6b1c8640..338458ca 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -151,6 +151,7 @@ lib/App/Netdisco/Web/Plugin/Device/Details.pm
lib/App/Netdisco/Web/Plugin/Device/Modules.pm
lib/App/Netdisco/Web/Plugin/Device/Neighbors.pm
lib/App/Netdisco/Web/Plugin/Device/Ports.pm
+lib/App/Netdisco/Web/Plugin/Device/Vlans.pm
lib/App/Netdisco/Web/Plugin/Inventory.pm
lib/App/Netdisco/Web/Plugin/Report/ApChannelDist.pm
lib/App/Netdisco/Web/Plugin/Report/ApClients.pm
@@ -391,6 +392,8 @@ share/views/ajax/device/modules.tt
share/views/ajax/device/netmap.tt
share/views/ajax/device/ports.tt
share/views/ajax/device/ports_csv.tt
+share/views/ajax/device/vlans.tt
+share/views/ajax/device/vlans_csv.tt
share/views/ajax/report/apchanneldist.tt
share/views/ajax/report/apchanneldist_csv.tt
share/views/ajax/report/apclients.tt
diff --git a/lib/App/Netdisco/Web/Plugin/Device/Vlans.pm b/lib/App/Netdisco/Web/Plugin/Device/Vlans.pm
new file mode 100644
index 00000000..b5d504a9
--- /dev/null
+++ b/lib/App/Netdisco/Web/Plugin/Device/Vlans.pm
@@ -0,0 +1,36 @@
+package App::Netdisco::Web::Plugin::Device::Vlans;
+
+use strict;
+use warnings;
+
+use Dancer ':syntax';
+use Dancer::Plugin::Ajax;
+use Dancer::Plugin::DBIC;
+use Dancer::Plugin::Auth::Extensible;
+
+use App::Netdisco::Web::Plugin;
+
+register_device_tab({ tag => 'vlans', label => 'VLANs', provides_csv => 1 });
+
+get '/ajax/content/device/vlans' => require_login sub {
+ my $q = param('q');
+
+ my $device = schema('netdisco')->resultset('Device')
+ ->search_for_device($q) or send_error('Bad device', 400);
+ my @results = $device->vlans->search( {}, { order_by => 'vlan' } )->hri->all;
+
+ return unless scalar @results;
+
+ if (request->is_ajax) {
+ my $json = to_json( \@results );
+ template 'ajax/device/vlans.tt', { results => $json },
+ { layout => undef };
+ }
+ else {
+ header( 'Content-Type' => 'text/comma-separated-values' );
+ template 'ajax/device/vlans_csv.tt', { results => \@results },
+ { layout => undef };
+ }
+};
+
+true;
diff --git a/share/config.yml b/share/config.yml
index 24444fd4..be6950f2 100644
--- a/share/config.yml
+++ b/share/config.yml
@@ -87,6 +87,7 @@ web_plugins:
- Device::Modules
- Device::Neighbors
- Device::Addresses
+ - Device::Vlans
extra_web_plugins: []
sidebar_defaults:
search_node:
diff --git a/share/views/ajax/device/vlans.tt b/share/views/ajax/device/vlans.tt
new file mode 100644
index 00000000..aa8f795f
--- /dev/null
+++ b/share/views/ajax/device/vlans.tt
@@ -0,0 +1,31 @@
+
+
+
+ | VLAN ID |
+ VLAN Name |
+
+
+
+
+
diff --git a/share/views/ajax/device/vlans_csv.tt b/share/views/ajax/device/vlans_csv.tt
new file mode 100644
index 00000000..51bb160c
--- /dev/null
+++ b/share/views/ajax/device/vlans_csv.tt
@@ -0,0 +1,10 @@
+[% USE CSV -%]
+[% CSV.dump([ 'VLAN ID' 'VLAN Name' ]) %]
+
+[% FOREACH row IN results %]
+ [% mylist = [] %]
+ [% mylist.push(row.vlan) %]
+ [% mylist.push(row.description) %]
+ [% CSV.dump(mylist) %]
+
+[% END %]
diff --git a/share/views/ajax/search/port.tt b/share/views/ajax/search/port.tt
index 25c1a1cc..99635b8d 100644
--- a/share/views/ajax/search/port.tt
+++ b/share/views/ajax/search/port.tt
@@ -4,7 +4,7 @@
Status |
Name |
Port |
- Vlan |
+ VLAN |
Speed |
Last Change |
diff --git a/share/views/ajax/search/port_csv.tt b/share/views/ajax/search/port_csv.tt
index e9aa5db8..5ac669ee 100644
--- a/share/views/ajax/search/port_csv.tt
+++ b/share/views/ajax/search/port_csv.tt
@@ -1,5 +1,5 @@
[% USE CSV -%]
-[% CSV.dump([ 'Name' 'Port' 'Description' 'Vlan' ]) %]
+[% CSV.dump([ 'Name' 'Port' 'Description' 'VLAN' ]) %]
[% FOREACH row IN results %]
[% mylist = [] %]
diff --git a/share/views/ajax/search/vlan.tt b/share/views/ajax/search/vlan.tt
index aa75ce85..aa81060d 100644
--- a/share/views/ajax/search/vlan.tt
+++ b/share/views/ajax/search/vlan.tt
@@ -1,7 +1,7 @@
- | Vlan |
+ VLAN |
Device |
Description |
Model |
diff --git a/share/views/ajax/search/vlan_csv.tt b/share/views/ajax/search/vlan_csv.tt
index 1d095856..82b0e33e 100644
--- a/share/views/ajax/search/vlan_csv.tt
+++ b/share/views/ajax/search/vlan_csv.tt
@@ -1,5 +1,5 @@
[% USE CSV -%]
-[% CSV.dump([ 'Vlan' 'Device' 'Description' 'Model' 'OS' 'Vendor' ]) %]
+[% CSV.dump([ 'VLAN' 'Device' 'Description' 'Model' 'OS' 'Vendor' ]) %]
[% FOREACH row IN results %]
[% mylist = [] %]