diff --git a/netbox/project-static/js/interface_toggles.js b/netbox/project-static/js/interface_toggles.js
new file mode 100644
index 000000000..a3649558a
--- /dev/null
+++ b/netbox/project-static/js/interface_toggles.js
@@ -0,0 +1,30 @@
+// Toggle the display of IP addresses under interfaces
+$('button.toggle-ips').click(function() {
+ var selected = $(this).attr('selected');
+ if (selected) {
+ $('#interfaces_table tr.ipaddresses').hide();
+ } else {
+ $('#interfaces_table tr.ipaddresses').show();
+ }
+ $(this).attr('selected', !selected);
+ $(this).children('span').toggleClass('glyphicon-check glyphicon-unchecked');
+ return false;
+});
+
+// Inteface filtering
+$('input.interface-filter').on('input', function() {
+ var filter = new RegExp(this.value);
+
+ for (interface of $(this).closest('form').find('tbody > tr')) {
+ // Slice off 'interface_' at the start of the ID
+ if (filter && filter.test(interface.id.slice(10))) {
+ // Match the toggle in case the filter now matches the interface
+ $(interface).find('input:checkbox[name=pk]').prop('checked', $('input.toggle').prop('checked'));
+ $(interface).show();
+ } else {
+ // Uncheck to prevent actions from including it when it doesn't match
+ $(interface).find('input:checkbox[name=pk]').prop('checked', false);
+ $(interface).hide();
+ }
+ }
+});
diff --git a/netbox/templates/dcim/device.html b/netbox/templates/dcim/device.html
index 3b3beb3e0..f88838028 100644
--- a/netbox/templates/dcim/device.html
+++ b/netbox/templates/dcim/device.html
@@ -903,35 +903,8 @@ function toggleConnection(elem) {
$(".cable-toggle").click(function() {
return toggleConnection($(this));
});
-// Toggle the display of IP addresses under interfaces
-$('button.toggle-ips').click(function() {
- var selected = $(this).attr('selected');
- if (selected) {
- $('#interfaces_table tr.ipaddresses').hide();
- } else {
- $('#interfaces_table tr.ipaddresses').show();
- }
- $(this).attr('selected', !selected);
- $(this).children('span').toggleClass('glyphicon-check glyphicon-unchecked');
- return false;
-});
-$('input.interface-filter').on('input', function() {
- var filter = new RegExp(this.value);
-
- for (interface of $(this).closest('form').find('tbody > tr')) {
- // Slice off 'interface_' at the start of the ID
- if (filter && filter.test(interface.id.slice(10))) {
- // Match the toggle in case the filter now matches the interface
- $(interface).find('input:checkbox[name=pk]').prop('checked', $('input.toggle').prop('checked'));
- $(interface).show();
- } else {
- // Uncheck to prevent actions from including it when it doesn't match
- $(interface).find('input:checkbox[name=pk]').prop('checked', false);
- $(interface).hide();
- }
- }
-});
+
{% endblock %}
diff --git a/netbox/templates/virtualization/virtualmachine.html b/netbox/templates/virtualization/virtualmachine.html
index 298daf94f..6477c71ad 100644
--- a/netbox/templates/virtualization/virtualmachine.html
+++ b/netbox/templates/virtualization/virtualmachine.html
@@ -1,5 +1,6 @@
{% extends '_base.html' %}
{% load custom_links %}
+{% load static %}
{% load helpers %}
{% block header %}
@@ -315,34 +316,5 @@
{% endblock %}
{% block javascript %}
-
+
{% endblock %}