diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index fe652576b..8db120bcd 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1019,7 +1019,11 @@ class DeviceView(ObjectView): consoleports = ConsolePort.objects.restrict(request.user, 'view').filter(device=device).prefetch_related( 'cable', '_path__destination', ) - consoleport_table = tables.DeviceConsolePortTable(consoleports, orderable=False) + consoleport_table = tables.DeviceConsolePortTable( + data=consoleports, + user=request.user, + orderable=False + ) if request.user.has_perm('dcim.change_consoleport') or request.user.has_perm('dcim.delete_consoleport'): consoleport_table.columns.show('pk') @@ -1029,7 +1033,11 @@ class DeviceView(ObjectView): ).prefetch_related( 'cable', '_path__destination', ) - consoleserverport_table = tables.DeviceConsoleServerPortTable(consoleserverports, orderable=False) + consoleserverport_table = tables.DeviceConsoleServerPortTable( + data=consoleserverports, + user=request.user, + orderable=False + ) if request.user.has_perm('dcim.change_consoleserverport') or \ request.user.has_perm('dcim.delete_consoleserverport'): consoleserverport_table.columns.show('pk') @@ -1038,7 +1046,11 @@ class DeviceView(ObjectView): powerports = PowerPort.objects.restrict(request.user, 'view').filter(device=device).prefetch_related( 'cable', '_path__destination', ) - powerport_table = tables.DevicePowerPortTable(powerports, orderable=False) + powerport_table = tables.DevicePowerPortTable( + data=powerports, + user=request.user, + orderable=False + ) if request.user.has_perm('dcim.change_powerport') or request.user.has_perm('dcim.delete_powerport'): powerport_table.columns.show('pk') @@ -1046,7 +1058,11 @@ class DeviceView(ObjectView): poweroutlets = PowerOutlet.objects.restrict(request.user, 'view').filter(device=device).prefetch_related( 'cable', 'power_port', '_path__destination', ) - poweroutlet_table = tables.DevicePowerOutletTable(poweroutlets, orderable=False) + poweroutlet_table = tables.DevicePowerOutletTable( + data=poweroutlets, + user=request.user, + orderable=False + ) if request.user.has_perm('dcim.change_poweroutlet') or request.user.has_perm('dcim.delete_poweroutlet'): poweroutlet_table.columns.show('pk') @@ -1056,7 +1072,11 @@ class DeviceView(ObjectView): Prefetch('member_interfaces', queryset=Interface.objects.restrict(request.user)), 'lag', 'cable', '_path__destination', 'tags', ) - interface_table = tables.DeviceInterfaceTable(interfaces, orderable=False) + interface_table = tables.DeviceInterfaceTable( + data=interfaces, + user=request.user, + orderable=False + ) if request.user.has_perm('dcim.change_interface') or request.user.has_perm('dcim.delete_interface'): interface_table.columns.show('pk') @@ -1064,13 +1084,21 @@ class DeviceView(ObjectView): frontports = FrontPort.objects.restrict(request.user, 'view').filter(device=device).prefetch_related( 'rear_port', 'cable', ) - frontport_table = tables.DeviceFrontPortTable(frontports, orderable=False) + frontport_table = tables.DeviceFrontPortTable( + data=frontports, + user=request.user, + orderable=False + ) if request.user.has_perm('dcim.change_frontport') or request.user.has_perm('dcim.delete_frontport'): frontport_table.columns.show('pk') # Rear ports rearports = RearPort.objects.restrict(request.user, 'view').filter(device=device).prefetch_related('cable') - rearport_table = tables.DeviceRearPortTable(rearports, orderable=False) + rearport_table = tables.DeviceRearPortTable( + data=rearports, + user=request.user, + orderable=False + ) if request.user.has_perm('dcim.change_rearport') or request.user.has_perm('dcim.delete_rearport'): rearport_table.columns.show('pk') @@ -1078,7 +1106,11 @@ class DeviceView(ObjectView): devicebays = DeviceBay.objects.restrict(request.user, 'view').filter(device=device).prefetch_related( 'installed_device__device_type__manufacturer', ) - devicebay_table = tables.DeviceDeviceBayTable(devicebays, orderable=False) + devicebay_table = tables.DeviceDeviceBayTable( + data=devicebays, + user=request.user, + orderable=False + ) if request.user.has_perm('dcim.change_devicebay') or request.user.has_perm('dcim.delete_devicebay'): devicebay_table.columns.show('pk') @@ -1086,7 +1118,11 @@ class DeviceView(ObjectView): inventoryitems = InventoryItem.objects.restrict(request.user, 'view').filter( device=device ).prefetch_related('manufacturer') - inventoryitem_table = tables.DeviceInventoryItemTable(inventoryitems, orderable=False) + inventoryitem_table = tables.DeviceInventoryItemTable( + data=inventoryitems, + user=request.user, + orderable=False + ) if request.user.has_perm('dcim.change_inventoryitem') or request.user.has_perm('dcim.delete_inventoryitem'): devicebay_table.columns.show('pk') diff --git a/netbox/project-static/css/base.css b/netbox/project-static/css/base.css index 9a7ad35ab..8ec21a30a 100644 --- a/netbox/project-static/css/base.css +++ b/netbox/project-static/css/base.css @@ -193,10 +193,6 @@ table.component-list td.subtable td { padding-bottom: 6px; padding-top: 6px; } -table.interface-ips th { - font-size: 80%; - font-weight: normal; -} /* Reports */ table.reports td.method { diff --git a/netbox/project-static/js/tableconfig.js b/netbox/project-static/js/tableconfig.js new file mode 100644 index 000000000..8f4692ea4 --- /dev/null +++ b/netbox/project-static/js/tableconfig.js @@ -0,0 +1,47 @@ +$(document).ready(function() { + $('form.userconfigform input.reset').click(function(event) { + // Deselect all columns when the reset button is clicked + $('select[name="columns"]').val([]); + }); + + $('form.userconfigform').submit(function(event) { + event.preventDefault(); + + // Derive an array from the dotted path to the config root + let path = this.getAttribute('data-config-root').split('.'); + let data = {}; + let pointer = data; + + // Construct a nested JSON object from the path + let node; + for (node of path) { + pointer[node] = {}; + pointer = pointer[node]; + } + + // Assign the form data to the child node + let field; + $.each($(this).find('[id^="id_"]:input'), function(index, value) { + field = $(value); + pointer[field.attr("name")] = field.val(); + }); + + // Make the REST API request + $.ajax({ + url: netbox_api_path + 'users/config/', + async: true, + contentType: 'application/json', + dataType: 'json', + type: 'PATCH', + beforeSend: function(xhr, settings) { + xhr.setRequestHeader("X-CSRFToken", netbox_csrf_token); + }, + data: JSON.stringify(data), + }).done(function () { + // Reload the page + window.location.reload(true); + }).fail(function (xhr, status, error) { + alert("Failed to update user config (" + status + "): " + error); + }); + }); +}); diff --git a/netbox/templates/base.html b/netbox/templates/base.html index 20042d151..b355d8d01 100644 --- a/netbox/templates/base.html +++ b/netbox/templates/base.html @@ -96,6 +96,7 @@ onerror="window.location='{% url 'media_failure' %}?filename=js/forms.js'"> + {% endblock %} diff --git a/netbox/templates/utilities/obj_list.html b/netbox/templates/utilities/obj_list.html index 47f11e1c1..a3f8faf9b 100644 --- a/netbox/templates/utilities/obj_list.html +++ b/netbox/templates/utilities/obj_list.html @@ -1,12 +1,13 @@ {% extends 'base.html' %} {% load buttons %} {% load helpers %} +{% load static %} {% block content %}
{% block buttons %}{% endblock %} {% if request.user.is_authenticated and table_config_form %} - + {% endif %} {% if permissions.add and 'add' in action_buttons %} {% add_button content_type.model_class|validated_viewname:"add" %} @@ -71,9 +72,6 @@ {% endwith %} {% include 'inc/paginator.html' with paginator=table.paginator page=table.page %}
- {% if table_config_form %} - {% include 'inc/table_config_form.html' %} - {% endif %}
{% if filter_form %}
@@ -82,4 +80,9 @@
{% endif %} +{% table_config_form table table_name="ObjectTable" %} +{% endblock %} + +{% block javascript %} + {% endblock %} diff --git a/netbox/templates/inc/table_config_form.html b/netbox/templates/utilities/templatetags/table_config_form.html similarity index 84% rename from netbox/templates/inc/table_config_form.html rename to netbox/templates/utilities/templatetags/table_config_form.html index 66844c7ca..e8fcf7dfe 100644 --- a/netbox/templates/inc/table_config_form.html +++ b/netbox/templates/utilities/templatetags/table_config_form.html @@ -1,5 +1,5 @@ {% load form_helpers %} -