From 91f33d328936f85569e796ca0a1ba95f51ffe355 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 13 Dec 2021 16:51:59 -0500 Subject: [PATCH 01/13] #8057: Enable dynamic tables for object list views --- netbox/netbox/views/generic.py | 7 ++++ netbox/templates/base/base.html | 3 ++ netbox/templates/generic/object_list.html | 7 ++-- netbox/templates/htmx/table.html | 5 +++ netbox/templates/inc/paginator_htmx.html | 43 +++++++++++++++++++++++ netbox/templates/inc/table_htmx.html | 41 +++++++++++++++++++++ netbox/utilities/htmx.py | 5 +++ 7 files changed, 107 insertions(+), 4 deletions(-) create mode 100644 netbox/templates/htmx/table.html create mode 100644 netbox/templates/inc/paginator_htmx.html create mode 100644 netbox/templates/inc/table_htmx.html create mode 100644 netbox/utilities/htmx.py diff --git a/netbox/netbox/views/generic.py b/netbox/netbox/views/generic.py index 1c2ff9917..9b6ae691b 100644 --- a/netbox/netbox/views/generic.py +++ b/netbox/netbox/views/generic.py @@ -23,6 +23,7 @@ from utilities.exceptions import AbortTransaction, PermissionsViolation from utilities.forms import ( BootstrapMixin, BulkRenameForm, ConfirmationForm, CSVDataField, CSVFileField, ImportForm, restrict_form_fields, ) +from utilities.htmx import is_htmx from utilities.permissions import get_permission_for_model from utilities.tables import paginate_table from utilities.utils import normalize_querydict, prepare_cloned_fields @@ -185,6 +186,12 @@ class ObjectListView(ObjectPermissionRequiredMixin, View): table = self.get_table(request, permissions) paginate_table(table, request) + # If this is an HTMX request, return only the rendered table HTML + if is_htmx(request): + return render(request, 'htmx/table.html', { + 'table': table, + }) + context = { 'content_type': content_type, 'table': table, diff --git a/netbox/templates/base/base.html b/netbox/templates/base/base.html index 43e5c2dfb..52d9c6603 100644 --- a/netbox/templates/base/base.html +++ b/netbox/templates/base/base.html @@ -160,6 +160,9 @@ })(); + {# TODO: Package HTMX JS locally #} + + {# Page layout #} {% block layout %}{% endblock %} diff --git a/netbox/templates/generic/object_list.html b/netbox/templates/generic/object_list.html index 61e799eee..1436958d7 100644 --- a/netbox/templates/generic/object_list.html +++ b/netbox/templates/generic/object_list.html @@ -95,10 +95,11 @@ {# Object table #}
-
+
- {% render_table table 'inc/table.html' %} + {% render_table table 'inc/table_htmx.html' %}
+ {% include 'inc/paginator_htmx.html' with paginator=table.paginator page=table.page %}
@@ -125,8 +126,6 @@ - {# Paginator #} - {% include 'inc/paginator.html' with paginator=table.paginator page=table.page %}
{# Filter form #} diff --git a/netbox/templates/htmx/table.html b/netbox/templates/htmx/table.html new file mode 100644 index 000000000..711708e32 --- /dev/null +++ b/netbox/templates/htmx/table.html @@ -0,0 +1,5 @@ +{# Render an HTML table element #} +{% load render_table from django_tables2 %} + +{% render_table table 'inc/table_htmx.html' %} +{% include 'inc/paginator_htmx.html' with paginator=table.paginator page=table.page %} diff --git a/netbox/templates/inc/paginator_htmx.html b/netbox/templates/inc/paginator_htmx.html new file mode 100644 index 000000000..c3b50cbd4 --- /dev/null +++ b/netbox/templates/inc/paginator_htmx.html @@ -0,0 +1,43 @@ +{% load helpers %} + +
+
+ {% if paginator.num_pages > 1 %} +
+ {% if page.has_previous %} + + + + {% endif %} + {% for p in page.smart_pages %} + {% if p %} + + {{ p }} + + {% else %} + + {% endif %} + {% endfor %} + {% if page.has_next %} + + + + {% endif %} +
+ {% endif %} +
+
+ +
+
diff --git a/netbox/templates/inc/table_htmx.html b/netbox/templates/inc/table_htmx.html new file mode 100644 index 000000000..58b5e7294 --- /dev/null +++ b/netbox/templates/inc/table_htmx.html @@ -0,0 +1,41 @@ +{% load django_tables2 %} + + + {% if table.show_header %} + + + {% for column in table.columns %} + {% if column.orderable %} + {{ column.header }} + {% else %} + {{ column.header }} + {% endif %} + {% endfor %} + + + {% endif %} + + {% for row in table.page.object_list|default:table.rows %} + + {% for column, cell in row.items %} + {{ cell }} + {% endfor %} + + {% empty %} + {% if table.empty_text %} + + — {{ table.empty_text }} — + + {% endif %} + {% endfor %} + + {% if table.has_footer %} + + + {% for column in table.columns %} + {{ column.footer }} + {% endfor %} + + + {% endif %} + diff --git a/netbox/utilities/htmx.py b/netbox/utilities/htmx.py new file mode 100644 index 000000000..8fc568e2b --- /dev/null +++ b/netbox/utilities/htmx.py @@ -0,0 +1,5 @@ +def is_htmx(request): + """ + Returns True if the request was made by HTMX; False otherwise. + """ + return 'Hx-Request' in request.headers From 5c34a7503216dffe86c8072142384cf182cb4a6b Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Mon, 13 Dec 2021 20:13:06 -0500 Subject: [PATCH 02/13] Enable HTMX for quick table search --- netbox/templates/generic/object_list.html | 2 +- netbox/templates/inc/table_controls_htmx.html | 32 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 netbox/templates/inc/table_controls_htmx.html diff --git a/netbox/templates/generic/object_list.html b/netbox/templates/generic/object_list.html index 1436958d7..f05cc3f4d 100644 --- a/netbox/templates/generic/object_list.html +++ b/netbox/templates/generic/object_list.html @@ -87,7 +87,7 @@ {% endif %} {# Object table controls #} - {% include 'inc/table_controls.html' with table_modal="ObjectTable_config" %} + {% include 'inc/table_controls_htmx.html' with table_modal="ObjectTable_config" %}
{% csrf_token %} diff --git a/netbox/templates/inc/table_controls_htmx.html b/netbox/templates/inc/table_controls_htmx.html new file mode 100644 index 000000000..ab8167bc0 --- /dev/null +++ b/netbox/templates/inc/table_controls_htmx.html @@ -0,0 +1,32 @@ +{% load helpers %} + +
+
+
+ +
+
+
+ {% if request.user.is_authenticated and table_modal %} +
+ +
+ {% endif %} +
+
From 6dd6094088bc483508a776e84a809c688f29449c Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 14 Dec 2021 08:25:17 -0500 Subject: [PATCH 03/13] Push HTMX URL to browser location --- netbox/templates/inc/paginator_htmx.html | 30 ++++++++++++++++++++---- netbox/templates/inc/table_htmx.html | 8 ++++++- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/netbox/templates/inc/paginator_htmx.html b/netbox/templates/inc/paginator_htmx.html index c3b50cbd4..75a904a15 100644 --- a/netbox/templates/inc/paginator_htmx.html +++ b/netbox/templates/inc/paginator_htmx.html @@ -5,13 +5,23 @@ {% if paginator.num_pages > 1 %}
{% if page.has_previous %} - + {% endif %} {% for p in page.smart_pages %} {% if p %} - + {{ p }} {% else %} @@ -21,7 +31,12 @@ {% endif %} {% endfor %} {% if page.has_next %} - + {% endif %} @@ -35,7 +50,14 @@
diff --git a/netbox/templates/inc/table_htmx.html b/netbox/templates/inc/table_htmx.html index 58b5e7294..7a20debae 100644 --- a/netbox/templates/inc/table_htmx.html +++ b/netbox/templates/inc/table_htmx.html @@ -6,7 +6,13 @@ {% for column in table.columns %} {% if column.orderable %} - {{ column.header }} + + {{ column.header }} + {% else %} {{ column.header }} {% endif %} From 414d33eb2635d8fa18c0938d0ea11e080f2f2b36 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 14 Dec 2021 11:41:39 -0500 Subject: [PATCH 04/13] Refactor HTMX table template --- netbox/templates/generic/object_list.html | 5 +- netbox/templates/htmx/table.html | 2 +- netbox/templates/inc/table_htmx.html | 88 ++++++++++++----------- 3 files changed, 47 insertions(+), 48 deletions(-) diff --git a/netbox/templates/generic/object_list.html b/netbox/templates/generic/object_list.html index f05cc3f4d..1de818ef6 100644 --- a/netbox/templates/generic/object_list.html +++ b/netbox/templates/generic/object_list.html @@ -96,10 +96,7 @@ {# Object table #}
-
- {% render_table table 'inc/table_htmx.html' %} -
- {% include 'inc/paginator_htmx.html' with paginator=table.paginator page=table.page %} + {% include 'htmx/table.html' %}
diff --git a/netbox/templates/htmx/table.html b/netbox/templates/htmx/table.html index 711708e32..c5d0ac46b 100644 --- a/netbox/templates/htmx/table.html +++ b/netbox/templates/htmx/table.html @@ -1,4 +1,4 @@ -{# Render an HTML table element #} +{# Render an HTMX-enabled table with paginator #} {% load render_table from django_tables2 %} {% render_table table 'inc/table_htmx.html' %} diff --git a/netbox/templates/inc/table_htmx.html b/netbox/templates/inc/table_htmx.html index 7a20debae..bf8156c2b 100644 --- a/netbox/templates/inc/table_htmx.html +++ b/netbox/templates/inc/table_htmx.html @@ -1,47 +1,49 @@ {% load django_tables2 %} - - {% if table.show_header %} - - - {% for column in table.columns %} - {% if column.orderable %} - - {{ column.header }} - - {% else %} - {{ column.header }} - {% endif %} - {% endfor %} - - - {% endif %} - - {% for row in table.page.object_list|default:table.rows %} - - {% for column, cell in row.items %} - {{ cell }} - {% endfor %} - - {% empty %} - {% if table.empty_text %} +
+ + {% if table.show_header %} + - — {{ table.empty_text }} — + {% for column in table.columns %} + {% if column.orderable %} + + {{ column.header }} + + {% else %} + {{ column.header }} + {% endif %} + {% endfor %} - {% endif %} - {% endfor %} - - {% if table.has_footer %} - - - {% for column in table.columns %} - {{ column.footer }} - {% endfor %} - - - {% endif %} - + + {% endif %} + + {% for row in table.page.object_list|default:table.rows %} + + {% for column, cell in row.items %} + {{ cell }} + {% endfor %} + + {% empty %} + {% if table.empty_text %} + + — {{ table.empty_text }} — + + {% endif %} + {% endfor %} + + {% if table.has_footer %} + + + {% for column in table.columns %} + {{ column.footer }} + {% endfor %} + + + {% endif %} + +
From 491eac184ec2f9183b61c97578ea30ce068a0cd3 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 14 Dec 2021 11:53:16 -0500 Subject: [PATCH 05/13] Enable HTMX for connections lists --- netbox/templates/dcim/connections_list.html | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/netbox/templates/dcim/connections_list.html b/netbox/templates/dcim/connections_list.html index 5dbea9129..ef8bef828 100644 --- a/netbox/templates/dcim/connections_list.html +++ b/netbox/templates/dcim/connections_list.html @@ -8,19 +8,14 @@ {% block content-wrapper %}
- {# Conncetions list #} + {# Connections list #}
- {% include 'inc/table_controls.html' %} - + {% include 'inc/table_controls_htmx.html' %}
-
-
- {% render_table table 'inc/table.html' %} -
+
+ {% include 'htmx/table.html' %}
- - {% include 'inc/paginator.html' with paginator=table.paginator page=table.page %}
{# Filter form #} From 4ffa823ab80d82e675b1d3dca9753d60c944e95b Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Tue, 14 Dec 2021 15:31:42 -0500 Subject: [PATCH 06/13] Enable HTMX for all ObjectChildrenViews --- netbox/dcim/views.py | 17 ++++++++++ netbox/ipam/views.py | 11 +++++-- netbox/netbox/views/generic.py | 13 +++++++- .../templates/dcim/device/consoleports.html | 11 ++++--- .../dcim/device/consoleserverports.html | 10 ++++-- netbox/templates/dcim/device/devicebays.html | 10 ++++-- netbox/templates/dcim/device/frontports.html | 10 ++++-- netbox/templates/dcim/device/interfaces.html | 18 +++++++++-- netbox/templates/dcim/device/inventory.html | 10 ++++-- .../templates/dcim/device/poweroutlets.html | 10 ++++-- netbox/templates/dcim/device/powerports.html | 10 ++++-- netbox/templates/dcim/device/rearports.html | 10 ++++-- .../dcim/devicetype/component_templates.html | 18 ++++------- .../templates/ipam/iprange/ip_addresses.html | 30 ++++++++++++++--- .../templates/ipam/prefix/ip_addresses.html | 32 +++++++++++++++---- netbox/templates/ipam/prefix/ip_ranges.html | 32 +++++++++++++++---- netbox/templates/ipam/prefix/prefixes.html | 32 +++++++++++++++---- netbox/templates/ipam/vlan/interfaces.html | 16 +++++++--- netbox/templates/ipam/vlan/vminterfaces.html | 16 +++++++--- .../virtualization/cluster/devices.html | 31 +++++++++--------- .../cluster/virtual_machines.html | 32 +++++++++++++------ .../virtualmachine/interfaces.html | 11 ++++--- netbox/virtualization/views.py | 4 +++ 23 files changed, 290 insertions(+), 104 deletions(-) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index b4096973a..a1d1102de 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -797,41 +797,49 @@ class DeviceTypeView(generic.ObjectView): class DeviceTypeConsolePortsView(DeviceTypeComponentsView): child_model = ConsolePortTemplate table = tables.ConsolePortTemplateTable + filterset = filtersets.ConsolePortTemplateFilterSet class DeviceTypeConsoleServerPortsView(DeviceTypeComponentsView): child_model = ConsoleServerPortTemplate table = tables.ConsoleServerPortTemplateTable + filterset = filtersets.ConsoleServerPortTemplateFilterSet class DeviceTypePowerPortsView(DeviceTypeComponentsView): child_model = PowerPortTemplate table = tables.PowerPortTemplateTable + filterset = filtersets.PowerPortTemplateFilterSet class DeviceTypePowerOutletsView(DeviceTypeComponentsView): child_model = PowerOutletTemplate table = tables.PowerOutletTemplateTable + filterset = filtersets.PowerOutletTemplateFilterSet class DeviceTypeInterfacesView(DeviceTypeComponentsView): child_model = InterfaceTemplate table = tables.InterfaceTemplateTable + filterset = filtersets.InterfaceTemplateFilterSet class DeviceTypeFrontPortsView(DeviceTypeComponentsView): child_model = FrontPortTemplate table = tables.FrontPortTemplateTable + filterset = filtersets.FrontPortTemplateFilterSet class DeviceTypeRearPortsView(DeviceTypeComponentsView): child_model = RearPortTemplate table = tables.RearPortTemplateTable + filterset = filtersets.RearPortTemplateFilterSet class DeviceTypeDeviceBaysView(DeviceTypeComponentsView): child_model = DeviceBayTemplate table = tables.DeviceBayTemplateTable + filterset = filtersets.DeviceBayTemplateFilterSet class DeviceTypeEditView(generic.ObjectEditView): @@ -1328,30 +1336,35 @@ class DeviceView(generic.ObjectView): class DeviceConsolePortsView(DeviceComponentsView): child_model = ConsolePort table = tables.DeviceConsolePortTable + filterset = filtersets.ConsolePortFilterSet template_name = 'dcim/device/consoleports.html' class DeviceConsoleServerPortsView(DeviceComponentsView): child_model = ConsoleServerPort table = tables.DeviceConsoleServerPortTable + filterset = filtersets.ConsoleServerPortFilterSet template_name = 'dcim/device/consoleserverports.html' class DevicePowerPortsView(DeviceComponentsView): child_model = PowerPort table = tables.DevicePowerPortTable + filterset = filtersets.PowerPortFilterSet template_name = 'dcim/device/powerports.html' class DevicePowerOutletsView(DeviceComponentsView): child_model = PowerOutlet table = tables.DevicePowerOutletTable + filterset = filtersets.PowerOutletFilterSet template_name = 'dcim/device/poweroutlets.html' class DeviceInterfacesView(DeviceComponentsView): child_model = Interface table = tables.DeviceInterfaceTable + filterset = filtersets.InterfaceFilterSet template_name = 'dcim/device/interfaces.html' def get_children(self, request, parent): @@ -1364,24 +1377,28 @@ class DeviceInterfacesView(DeviceComponentsView): class DeviceFrontPortsView(DeviceComponentsView): child_model = FrontPort table = tables.DeviceFrontPortTable + filterset = filtersets.FrontPortFilterSet template_name = 'dcim/device/frontports.html' class DeviceRearPortsView(DeviceComponentsView): child_model = RearPort table = tables.DeviceRearPortTable + filterset = filtersets.RearPortFilterSet template_name = 'dcim/device/rearports.html' class DeviceDeviceBaysView(DeviceComponentsView): child_model = DeviceBay table = tables.DeviceDeviceBayTable + filterset = filtersets.DeviceBayFilterSet template_name = 'dcim/device/devicebays.html' class DeviceInventoryView(DeviceComponentsView): child_model = InventoryItem table = tables.DeviceInventoryItemTable + filterset = filtersets.InventoryItemFilterSet template_name = 'dcim/device/inventory.html' diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 08253c054..7e6e1725f 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -1,21 +1,22 @@ from django.contrib.contenttypes.models import ContentType from django.db.models import Prefetch from django.db.models.expressions import RawSQL -from django.http import Http404 from django.shortcuts import get_object_or_404, redirect, render from django.urls import reverse +from dcim.filtersets import InterfaceFilterSet from dcim.models import Device, Interface, Site from dcim.tables import SiteTable from netbox.views import generic from utilities.tables import paginate_table from utilities.utils import count_related +from virtualization.filtersets import VMInterfaceFilterSet from virtualization.models import VirtualMachine, VMInterface from . import filtersets, forms, tables from .constants import * from .models import * from .models import ASN -from .utils import add_available_ipaddresses, add_requested_prefixes, add_available_vlans +from .utils import add_requested_prefixes, add_available_vlans # @@ -457,6 +458,7 @@ class PrefixPrefixesView(generic.ObjectChildrenView): queryset = Prefix.objects.all() child_model = Prefix table = tables.PrefixTable + filterset = filtersets.PrefixFilterSet template_name = 'ipam/prefix/prefixes.html' def get_children(self, request, parent): @@ -483,6 +485,7 @@ class PrefixIPRangesView(generic.ObjectChildrenView): queryset = Prefix.objects.all() child_model = IPRange table = tables.IPRangeTable + filterset = filtersets.IPRangeFilterSet template_name = 'ipam/prefix/ip_ranges.html' def get_children(self, request, parent): @@ -499,6 +502,7 @@ class PrefixIPAddressesView(generic.ObjectChildrenView): queryset = Prefix.objects.all() child_model = IPAddress table = tables.IPAddressTable + filterset = filtersets.IPAddressFilterSet template_name = 'ipam/prefix/ip_addresses.html' def get_children(self, request, parent): @@ -560,6 +564,7 @@ class IPRangeIPAddressesView(generic.ObjectChildrenView): queryset = IPRange.objects.all() child_model = IPAddress table = tables.IPAddressTable + filterset = filtersets.IPAddressFilterSet template_name = 'ipam/iprange/ip_addresses.html' def get_children(self, request, parent): @@ -959,6 +964,7 @@ class VLANInterfacesView(generic.ObjectChildrenView): queryset = VLAN.objects.all() child_model = Interface table = tables.VLANDevicesTable + filterset = InterfaceFilterSet template_name = 'ipam/vlan/interfaces.html' def get_children(self, request, parent): @@ -974,6 +980,7 @@ class VLANVMInterfacesView(generic.ObjectChildrenView): queryset = VLAN.objects.all() child_model = VMInterface table = tables.VLANVirtualMachinesTable + filterset = VMInterfaceFilterSet template_name = 'ipam/vlan/vminterfaces.html' def get_children(self, request, parent): diff --git a/netbox/netbox/views/generic.py b/netbox/netbox/views/generic.py index 62d580bf5..84928dfff 100644 --- a/netbox/netbox/views/generic.py +++ b/netbox/netbox/views/generic.py @@ -84,11 +84,12 @@ class ObjectChildrenView(ObjectView): queryset = None child_model = None table = None + filterset = None template_name = None def get_children(self, request, parent): """ - Return a QuerySet or iterable of child objects. + Return a QuerySet of child objects. request: The current request parent: The parent object @@ -102,6 +103,9 @@ class ObjectChildrenView(ObjectView): instance = get_object_or_404(self.queryset, **kwargs) child_objects = self.get_children(request, instance) + if self.filterset: + child_objects = self.filterset(request.GET, child_objects).qs + permissions = {} for action in ('change', 'delete'): perm_name = get_permission_for_model(self.child_model, action) @@ -113,6 +117,13 @@ class ObjectChildrenView(ObjectView): table.columns.show('pk') paginate_table(table, request) + # If this is an HTMX request, return only the rendered table HTML + if is_htmx(request): + return render(request, 'htmx/table.html', { + 'object': instance, + 'table': table, + }) + return render(request, self.get_template_name(), { 'object': instance, 'table': table, diff --git a/netbox/templates/dcim/device/consoleports.html b/netbox/templates/dcim/device/consoleports.html index 066c19b73..b5a8a0f39 100644 --- a/netbox/templates/dcim/device/consoleports.html +++ b/netbox/templates/dcim/device/consoleports.html @@ -6,10 +6,14 @@ {% block content %} {% csrf_token %} - {% include 'inc/table_controls.html' with table_modal="DeviceConsolePortTable_config" %} -
- {% render_table table 'inc/table.html' %} + {% include 'inc/table_controls_htmx.html' with table_modal="DeviceConsolePortTable_config" %} + +
+
+ {% include 'htmx/table.html' %} +
+
{% if perms.dcim.change_consoleport %} @@ -38,6 +42,5 @@ {% endif %}
- {% include 'inc/paginator.html' with paginator=table.paginator page=table.page %} {% table_config_form table %} {% endblock %} diff --git a/netbox/templates/dcim/device/consoleserverports.html b/netbox/templates/dcim/device/consoleserverports.html index 97c98bb9f..f77ef0169 100644 --- a/netbox/templates/dcim/device/consoleserverports.html +++ b/netbox/templates/dcim/device/consoleserverports.html @@ -6,10 +6,14 @@ {% block content %}
{% csrf_token %} - {% include 'inc/table_controls.html' with table_modal="DeviceConsoleServerPortTable_config" %} -
- {% render_table table 'inc/table.html' %} + {% include 'inc/table_controls_htmx.html' with table_modal="DeviceConsoleServerPortTable_config" %} + +
+
+ {% include 'htmx/table.html' %} +
+
{% if perms.dcim.change_consoleserverport %} diff --git a/netbox/templates/dcim/device/devicebays.html b/netbox/templates/dcim/device/devicebays.html index 572e8d110..960610fa8 100644 --- a/netbox/templates/dcim/device/devicebays.html +++ b/netbox/templates/dcim/device/devicebays.html @@ -6,10 +6,14 @@ {% block content %} {% csrf_token %} - {% include 'inc/table_controls.html' with table_modal="DeviceDeviceBayTable_config" %} -
- {% render_table table 'inc/table.html' %} + {% include 'inc/table_controls_htmx.html' with table_modal="DeviceDeviceBayTable_config" %} + +
+
+ {% include 'htmx/table.html' %} +
+
{% if perms.dcim.change_devicebay %} diff --git a/netbox/templates/dcim/device/frontports.html b/netbox/templates/dcim/device/frontports.html index 83dd2dc65..18c08abe4 100644 --- a/netbox/templates/dcim/device/frontports.html +++ b/netbox/templates/dcim/device/frontports.html @@ -6,10 +6,14 @@ {% block content %} {% csrf_token %} - {% include 'inc/table_controls.html' with table_modal="DeviceFrontPortTable_config" %} -
- {% render_table table 'inc/table.html' %} + {% include 'inc/table_controls_htmx.html' with table_modal="DeviceFrontPortTable_config" %} + +
+
+ {% include 'htmx/table.html' %} +
+
{% if perms.dcim.change_frontport %} diff --git a/netbox/templates/dcim/device/interfaces.html b/netbox/templates/dcim/device/interfaces.html index 7d9926fce..c7d86ae89 100644 --- a/netbox/templates/dcim/device/interfaces.html +++ b/netbox/templates/dcim/device/interfaces.html @@ -9,7 +9,15 @@
- +
@@ -34,9 +42,13 @@
-
- {% render_table table 'inc/table.html' %} + +
+
+ {% include 'htmx/table.html' %} +
+
{% if perms.dcim.change_interface %} diff --git a/netbox/templates/dcim/device/inventory.html b/netbox/templates/dcim/device/inventory.html index ee1ce9f52..699ae378f 100644 --- a/netbox/templates/dcim/device/inventory.html +++ b/netbox/templates/dcim/device/inventory.html @@ -6,10 +6,14 @@ {% block content %} {% csrf_token %} - {% include 'inc/table_controls.html' with table_modal="DeviceInventoryItemTable_config" %} -
- {% render_table table 'inc/table.html' %} + {% include 'inc/table_controls_htmx.html' with table_modal="DeviceInventoryItemTable_config" %} + +
+
+ {% include 'htmx/table.html' %} +
+
{% if perms.dcim.change_inventoryitem %} diff --git a/netbox/templates/dcim/device/poweroutlets.html b/netbox/templates/dcim/device/poweroutlets.html index ed49d24b8..af94e1264 100644 --- a/netbox/templates/dcim/device/poweroutlets.html +++ b/netbox/templates/dcim/device/poweroutlets.html @@ -6,10 +6,14 @@ {% block content %} {% csrf_token %} - {% include 'inc/table_controls.html' with table_modal="DevicePowerOutletTable_config" %} -
- {% render_table table 'inc/table.html' %} + {% include 'inc/table_controls_htmx.html' with table_modal="DevicePowerOutletTable_config" %} + +
+
+ {% include 'htmx/table.html' %} +
+
{% if perms.dcim.change_powerport %} diff --git a/netbox/templates/dcim/device/powerports.html b/netbox/templates/dcim/device/powerports.html index 453c5f5b0..7b993bc73 100644 --- a/netbox/templates/dcim/device/powerports.html +++ b/netbox/templates/dcim/device/powerports.html @@ -6,10 +6,14 @@ {% block content %} {% csrf_token %} - {% include 'inc/table_controls.html' with table_modal="DevicePowerPortTable_config" %} -
- {% render_table table 'inc/table.html' %} + {% include 'inc/table_controls_htmx.html' with table_modal="DevicePowerPortTable_config" %} + +
+
+ {% include 'htmx/table.html' %} +
+
{% if perms.dcim.change_powerport %} diff --git a/netbox/templates/dcim/device/rearports.html b/netbox/templates/dcim/device/rearports.html index 37807cd14..86f89e459 100644 --- a/netbox/templates/dcim/device/rearports.html +++ b/netbox/templates/dcim/device/rearports.html @@ -6,10 +6,14 @@ {% block content %} {% csrf_token %} - {% include 'inc/table_controls.html' with table_modal="DeviceRearPortTable_config" %} -
- {% render_table table 'inc/table.html' %} + {% include 'inc/table_controls_htmx.html' with table_modal="DeviceRearPortTable_config" %} + +
+
+ {% include 'htmx/table.html' %} +
+
{% if perms.dcim.change_rearport %} diff --git a/netbox/templates/dcim/devicetype/component_templates.html b/netbox/templates/dcim/devicetype/component_templates.html index d83a232cd..b1e0daf78 100644 --- a/netbox/templates/dcim/devicetype/component_templates.html +++ b/netbox/templates/dcim/devicetype/component_templates.html @@ -7,11 +7,9 @@ {% csrf_token %}
-
- {{ title }} -
-
- {% render_table table 'inc/table.html' %} +
{{ title }}
+
+ {% include 'htmx/table.html' %}