Просмотр исходного кода

Move device/VM component tables outside of cards

jeremystretch 4 лет назад
Родитель
Сommit
23be5694d0

+ 34 - 41
netbox/templates/dcim/device/consoleports.html

@@ -4,48 +4,41 @@
 {% load static %}
 
 {% block content %}
-<form method="post">
+  <form method="post">
     {% csrf_token %}
-    <div class="card">
-        <div class="card-header">
-            <h5 class="d-inline">Console Ports</h5>
-            <div class="float-end noprint">
-            {% if request.user.is_authenticated %}
-                <button type="button" class="btn btn-outline-dark btn-sm" data-bs-toggle="modal" data-bs-target="#DeviceConsolePortTable_config" title="Configure table"><i class="mdi mdi-cog"></i> Configure</button>
-            {% endif %}
+    <div class="float-end noprint">
+      {% if request.user.is_authenticated %}
+        <button type="button" class="btn btn-outline-dark btn-sm" data-bs-toggle="modal" data-bs-target="#DeviceConsolePortTable_config" title="Configure table"><i class="mdi mdi-cog"></i> Configure</button>
+      {% endif %}
+    </div>
+    {% render_table consoleport_table 'inc/table.html' %}
+    <div class="noprint">
+        {% if perms.dcim.change_consoleport %}
+            <button type="submit" name="_rename" formaction="{% url 'dcim:consoleport_bulk_rename' %}?return_url={% url 'dcim:device_consoleports' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
+                <i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
+            </button>
+            <button type="submit" name="_edit" formaction="{% url 'dcim:consoleport_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_consoleports' pk=object.pk %}" class="btn btn-warning btn-sm">
+                <i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
+            </button>
+            <button type="submit" name="_disconnect" formaction="{% url 'dcim:consoleport_bulk_disconnect' %}?return_url={% url 'dcim:device_consoleports' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
+                <span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
+            </button>
+        {% endif %}
+        {% if perms.dcim.delete_consoleport %}
+            <button type="submit" name="_delete" formaction="{% url 'dcim:consoleport_bulk_delete' %}?return_url={% url 'dcim:device_consoleports' pk=object.pk %}" class="btn btn-danger btn-sm">
+                <i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
+            </button>
+        {% endif %}
+        {% if perms.dcim.add_consoleport %}
+            <div class="float-end">
+                <a href="{% url 'dcim:consoleport_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_consoleports' pk=object.pk %}" class="btn btn-sm btn-primary">
+                    <i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Console Port
+                </a>
             </div>
-        </div>
-        <div class="card-body">
-            {% render_table consoleport_table 'inc/table.html' %}
-        </div>
-        <div class="card-footer noprint">
-            {% if perms.dcim.change_consoleport %}
-                <button type="submit" name="_rename" formaction="{% url 'dcim:consoleport_bulk_rename' %}?return_url={% url 'dcim:device_consoleports' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
-                    <i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
-                </button>
-                <button type="submit" name="_edit" formaction="{% url 'dcim:consoleport_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_consoleports' pk=object.pk %}" class="btn btn-warning btn-sm">
-                    <i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
-                </button>
-                <button type="submit" name="_disconnect" formaction="{% url 'dcim:consoleport_bulk_disconnect' %}?return_url={% url 'dcim:device_consoleports' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
-                    <span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
-                </button>
-            {% endif %}
-            {% if perms.dcim.delete_consoleport %}
-                <button type="submit" name="_delete" formaction="{% url 'dcim:consoleport_bulk_delete' %}?return_url={% url 'dcim:device_consoleports' pk=object.pk %}" class="btn btn-danger btn-sm">
-                    <i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
-                </button>
-            {% endif %}
-            {% if perms.dcim.add_consoleport %}
-                <div class="float-end">
-                    <a href="{% url 'dcim:consoleport_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_consoleports' pk=object.pk %}" class="btn btn-sm btn-primary">
-                        <i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Console Port
-                    </a>
-                </div>
-            {% endif %}
-            <div class="clearfix"></div>
-        </div>
+        {% endif %}
+        <div class="clearfix"></div>
     </div>
-</form>
-{% include 'inc/paginator.html' with paginator=consoleport_table.paginator page=consoleport_table.page %}
-{% table_config_form consoleport_table %}
+  </form>
+  {% include 'inc/paginator.html' with paginator=consoleport_table.paginator page=consoleport_table.page %}
+  {% table_config_form consoleport_table %}
 {% endblock %}

+ 34 - 41
netbox/templates/dcim/device/consoleserverports.html

@@ -4,48 +4,41 @@
 {% load static %}
 
 {% block content %}
-<form method="post">
+  <form method="post">
     {% csrf_token %}
-    <div class="card">
-        <div class="card-header">
-            <h5 class="d-inline">Console Server Ports</h5>
-            <div class="float-end noprint">
-            {% if request.user.is_authenticated %}
-                <button type="button" class="btn btn-outline-dark btn-sm" data-bs-toggle="modal" data-bs-target="#DeviceConsoleServerPortTable_config" title="Configure table"><i class="mdi mdi-cog"></i> Configure</button>
-            {% endif %}
+    <div class="float-end noprint">
+      {% if request.user.is_authenticated %}
+        <button type="button" class="btn btn-outline-dark btn-sm" data-bs-toggle="modal" data-bs-target="#DeviceConsoleServerPortTable_config" title="Configure table"><i class="mdi mdi-cog"></i> Configure</button>
+      {% endif %}
+    </div>
+    {% render_table consoleserverport_table 'inc/table.html' %}
+    <div class="noprint">
+        {% if perms.dcim.change_consoleserverport %}
+            <button type="submit" name="_rename" formaction="{% url 'dcim:consoleserverport_bulk_rename' %}?return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
+                <i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
+            </button>
+            <button type="submit" name="_edit" formaction="{% url 'dcim:consoleserverport_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}" class="btn btn-warning btn-sm">
+                <i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
+            </button>
+            <button type="submit" name="_disconnect" formaction="{% url 'dcim:consoleserverport_bulk_disconnect' %}?return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
+                <span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
+            </button>
+        {% endif %}
+        {% if perms.dcim.delete_consoleserverport %}
+            <button type="submit" formaction="{% url 'dcim:consoleserverport_bulk_delete' %}?return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}" class="btn btn-danger btn-sm">
+                <i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
+            </button>
+        {% endif %}
+        {% if perms.dcim.add_consoleserverport %}
+            <div class="float-end">
+                <a href="{% url 'dcim:consoleserverport_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}" class="btn btn-primary btn-sm">
+                    <i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Console Server Ports
+                </a>
             </div>
-        </div>
-        <div class="card-body">
-            {% render_table consoleserverport_table 'inc/table.html' %}
-        </div>
-        <div class="card-footer noprint">
-            {% if perms.dcim.change_consoleserverport %}
-                <button type="submit" name="_rename" formaction="{% url 'dcim:consoleserverport_bulk_rename' %}?return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
-                    <i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
-                </button>
-                <button type="submit" name="_edit" formaction="{% url 'dcim:consoleserverport_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}" class="btn btn-warning btn-sm">
-                    <i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
-                </button>
-                <button type="submit" name="_disconnect" formaction="{% url 'dcim:consoleserverport_bulk_disconnect' %}?return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
-                    <span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
-                </button>
-            {% endif %}
-            {% if perms.dcim.delete_consoleserverport %}
-                <button type="submit" formaction="{% url 'dcim:consoleserverport_bulk_delete' %}?return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}" class="btn btn-danger btn-sm">
-                    <i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
-                </button>
-            {% endif %}
-            {% if perms.dcim.add_consoleserverport %}
-                <div class="float-end">
-                    <a href="{% url 'dcim:consoleserverport_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}" class="btn btn-primary btn-sm">
-                        <i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Console Server Ports
-                    </a>
-                </div>
-            {% endif %}
-            <div class="clearfix"></div>
-        </div>
+        {% endif %}
+        <div class="clearfix"></div>
     </div>
-</form>
-{% include 'inc/paginator.html' with paginator=consoleserverport_table.paginator page=consoleserverport_table.page %}
-{% table_config_form consoleserverport_table %}
+  </form>
+  {% include 'inc/paginator.html' with paginator=consoleserverport_table.paginator page=consoleserverport_table.page %}
+  {% table_config_form consoleserverport_table %}
 {% endblock %}

+ 31 - 38
netbox/templates/dcim/device/devicebays.html

@@ -4,45 +4,38 @@
 {% load static %}
 
 {% block content %}
-<form method="post">
+  <form method="post">
     {% csrf_token %}
-    <div class="card">
-        <div class="card-header">
-            <h5 class="d-inline">Device Bays</h5>
-            <div class="float-end noprint">
-            {% if request.user.is_authenticated %}
-                <button type="button" class="btn btn-outline-dark btn-sm" data-bs-toggle="modal" data-bs-target="#DeviceDeviceBayTable_config" title="Configure table"><i class="mdi mdi-cog"></i> Configure</button>
-            {% endif %}
-            </div>
-        </div>
-        <div class="card-body">
-            {% render_table devicebay_table 'inc/table.html' %}
-        </div>
-        <div class="card-footer noprint">
-            {% if perms.dcim.change_devicebay %}
-                <button type="submit" name="_rename" formaction="{% url 'dcim:devicebay_bulk_rename' %}?return_url={{ object.get_absolute_url }}%23tab_devicebays" class="btn btn-outline-warning btn-sm">
-                    <i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
-                </button>
-                <button type="submit" name="_edit" formaction="{% url 'dcim:devicebay_bulk_edit' %}?device={{ object.pk }}&return_url={{ object.get_absolute_url }}%23tab_devicebays" class="btn btn-warning btn-sm">
-                    <i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
-                </button>
-            {% endif %}
-            {% if perms.dcim.delete_devicebay %}
-                <button type="submit" formaction="{% url 'dcim:devicebay_bulk_delete' %}?return_url={{ object.get_absolute_url }}%23tab_devicebays" class="btn btn-outline-danger btn-sm">
-                    <i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete selected
-                </button>
-            {% endif %}
-            {% if perms.dcim.add_devicebay %}
-                <div class="float-end">
-                    <a href="{% url 'dcim:devicebay_add' %}?device={{ object.pk }}&return_url={{ object.get_absolute_url }}%23tab_devicebays" class="btn btn-primary btn-sm">
-                        <i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Device Bays
-                    </a>
-                </div>
-            {% endif %}
-            <div class="clearfix"></div>
+    <div class="float-end noprint">
+      {% if request.user.is_authenticated %}
+        <button type="button" class="btn btn-outline-dark btn-sm" data-bs-toggle="modal" data-bs-target="#DeviceDeviceBayTable_config" title="Configure table"><i class="mdi mdi-cog"></i> Configure</button>
+      {% endif %}
+    </div>
+    {% render_table devicebay_table 'inc/table.html' %}
+    <div class="noprint">
+        {% if perms.dcim.change_devicebay %}
+            <button type="submit" name="_rename" formaction="{% url 'dcim:devicebay_bulk_rename' %}?return_url={{ object.get_absolute_url }}%23tab_devicebays" class="btn btn-outline-warning btn-sm">
+                <i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
+            </button>
+            <button type="submit" name="_edit" formaction="{% url 'dcim:devicebay_bulk_edit' %}?device={{ object.pk }}&return_url={{ object.get_absolute_url }}%23tab_devicebays" class="btn btn-warning btn-sm">
+                <i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
+            </button>
+        {% endif %}
+        {% if perms.dcim.delete_devicebay %}
+            <button type="submit" formaction="{% url 'dcim:devicebay_bulk_delete' %}?return_url={{ object.get_absolute_url }}%23tab_devicebays" class="btn btn-outline-danger btn-sm">
+                <i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete selected
+            </button>
+        {% endif %}
+        {% if perms.dcim.add_devicebay %}
+            <div class="float-end">
+                <a href="{% url 'dcim:devicebay_add' %}?device={{ object.pk }}&return_url={{ object.get_absolute_url }}%23tab_devicebays" class="btn btn-primary btn-sm">
+                    <i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Device Bays
+                </a>
             </div>
+        {% endif %}
+        <div class="clearfix"></div>
     </div>
-</form>
-{% include 'inc/paginator.html' with paginator=devicebay_table.paginator page=devicebay_table.page %}
-{% table_config_form devicebay_table %}
+  </form>
+  {% include 'inc/paginator.html' with paginator=devicebay_table.paginator page=devicebay_table.page %}
+  {% table_config_form devicebay_table %}
 {% endblock %}

+ 34 - 41
netbox/templates/dcim/device/frontports.html

@@ -4,48 +4,41 @@
 {% load static %}
 
 {% block content %}
-<form method="post">
+  <form method="post">
     {% csrf_token %}
-    <div class="card">
-        <div class="card-header">
-            <h5>Front Ports</h5>
-            <div class="float-end noprint">
-            {% if request.user.is_authenticated %}
-                <button type="button" class="btn btn-outline-dark btn-sm" data-bs-toggle="modal" data-bs-target="#DeviceFrontPortTable_config" title="Configure table"><i class="mdi mdi-cog"></i> Configure</button>
-            {% endif %}
+    <div class="float-end noprint">
+      {% if request.user.is_authenticated %}
+        <button type="button" class="btn btn-outline-dark btn-sm" data-bs-toggle="modal" data-bs-target="#DeviceFrontPortTable_config" title="Configure table"><i class="mdi mdi-cog"></i> Configure</button>
+      {% endif %}
+    </div>
+    {% render_table frontport_table 'inc/table.html' %}
+    <div class="noprint">
+        {% if perms.dcim.change_frontport %}
+            <button type="submit" name="_rename" formaction="{% url 'dcim:frontport_bulk_rename' %}?return_url={% url 'dcim:device_frontports' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
+                <i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
+            </button>
+            <button type="submit" name="_edit" formaction="{% url 'dcim:frontport_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_frontports' pk=object.pk %}" class="btn btn-warning btn-sm">
+                <i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
+            </button>
+            <button type="submit" name="_disconnect" formaction="{% url 'dcim:frontport_bulk_disconnect' %}?return_url={% url 'dcim:device_frontports' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
+                <span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
+            </button>
+        {% endif %}
+        {% if perms.dcim.delete_frontport %}
+            <button type="submit" formaction="{% url 'dcim:frontport_bulk_delete' %}?return_url={% url 'dcim:device_frontports' pk=object.pk %}" class="btn btn-danger btn-sm">
+                <i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
+            </button>
+        {% endif %}
+        {% if perms.dcim.add_frontport %}
+            <div class="float-end">
+                <a href="{% url 'dcim:frontport_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_frontports' pk=object.pk %}" class="btn btn-primary btn-sm">
+                    <i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add front ports
+                </a>
             </div>
-        </div>
-        <div class="card-body">
-            {% render_table frontport_table 'inc/table.html' %}
-        </div>
-        <div class="card-footer noprint">
-            {% if perms.dcim.change_frontport %}
-                <button type="submit" name="_rename" formaction="{% url 'dcim:frontport_bulk_rename' %}?return_url={% url 'dcim:device_frontports' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
-                    <i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
-                </button>
-                <button type="submit" name="_edit" formaction="{% url 'dcim:frontport_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_frontports' pk=object.pk %}" class="btn btn-warning btn-sm">
-                    <i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
-                </button>
-                <button type="submit" name="_disconnect" formaction="{% url 'dcim:frontport_bulk_disconnect' %}?return_url={% url 'dcim:device_frontports' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
-                    <span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
-                </button>
-            {% endif %}
-            {% if perms.dcim.delete_frontport %}
-                <button type="submit" formaction="{% url 'dcim:frontport_bulk_delete' %}?return_url={% url 'dcim:device_frontports' pk=object.pk %}" class="btn btn-danger btn-sm">
-                    <i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
-                </button>
-            {% endif %}
-            {% if perms.dcim.add_frontport %}
-                <div class="float-end">
-                    <a href="{% url 'dcim:frontport_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_frontports' pk=object.pk %}" class="btn btn-primary btn-sm">
-                        <i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add front ports
-                    </a>
-                </div>
-            {% endif %}
-            <div class="clearfix"></div>
-        </div>
+        {% endif %}
+        <div class="clearfix"></div>
     </div>
-</form>
-{% include 'inc/paginator.html' with paginator=frontport_table.paginator page=frontport_table.page %}
-{% table_config_form frontport_table %}
+  </form>
+  {% include 'inc/paginator.html' with paginator=frontport_table.paginator page=frontport_table.page %}
+  {% table_config_form frontport_table %}
 {% endblock %}

+ 49 - 56
netbox/templates/dcim/device/interfaces.html

@@ -4,65 +4,58 @@
 {% load static %}
 
 {% block content %}
-<form method="post">
+  <form method="post">
     {% csrf_token %}
-    <div class="card">
-        <div class="card-header">
-            <h5 class="d-inline">Interfaces</h5>
-            <div class="float-end col-md-4 noprint table-controls mw-33">
-                <div class="input-group input-group-sm">
-                    <input type="text" class="form-control interface-filter" placeholder="Filter" title="Filter text (regular expressions supported)" />
-                    <button class="btn btn-sm btn-outline-dark dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
-                        <i class="mdi mdi-table-cog"></i>
+    <div class="float-end col-md-4 noprint table-controls mw-33">
+        <div class="input-group input-group-sm">
+            <input type="text" class="form-control interface-filter" placeholder="Filter" title="Filter text (regular expressions supported)" />
+            <button class="btn btn-sm btn-outline-dark dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
+                <i class="mdi mdi-table-cog"></i>
+            </button>
+            <ul class="dropdown-menu">
+                {% if request.user.is_authenticated %}
+                    <button
+                        type="button"
+                        class="dropdown-item"
+                        data-bs-toggle="modal"
+                        data-bs-target="#DeviceInterfaceTable_config"
+                        title="Configure Table">
+                        Configure Table
                     </button>
-                    <ul class="dropdown-menu">
-                        {% if request.user.is_authenticated %}
-                            <button
-                                type="button"
-                                class="dropdown-item"
-                                data-bs-toggle="modal"
-                                data-bs-target="#DeviceInterfaceTable_config"
-                                title="Configure Table">
-                                Configure Table
-                            </button>
-                        {% endif %}
-                        <button type="button" class="dropdown-item toggle-enabled" data-state="show">Hide Enabled</button>
-                        <button type="button" class="dropdown-item toggle-disabled" data-state="show">Hide Disabled</button>
-                    </ul>
-                </div>
-            </div>
-        </div>
-        <div class="card-body">
-            {% render_table interface_table 'inc/table.html' %}
+                {% endif %}
+                <button type="button" class="dropdown-item toggle-enabled" data-state="show">Hide Enabled</button>
+                <button type="button" class="dropdown-item toggle-disabled" data-state="show">Hide Disabled</button>
+            </ul>
         </div>
-        <div class="card-footer noprint">
-            {% if perms.dcim.change_interface %}
-                <button type="submit" name="_rename" formaction="{% url 'dcim:interface_bulk_rename' %}?return_url={% url 'dcim:device_interfaces' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
-                    <i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
-                </button>
-                <button type="submit" name="_edit" formaction="{% url 'dcim:interface_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_interfaces' pk=object.pk %}" class="btn btn-warning btn-sm">
-                    <i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
-                </button>
-                <button type="submit" name="_disconnect" formaction="{% url 'dcim:interface_bulk_disconnect' %}?return_url={% url 'dcim:device_interfaces' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
-                    <span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
-                </button>
-            {% endif %}
-            {% if perms.dcim.delete_interface %}
-                <button type="submit" name="_delete" formaction="{% url 'dcim:interface_bulk_delete' %}?return_url={% url 'dcim:device_interfaces' pk=object.pk %}" class="btn btn-danger btn-sm">
-                    <i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
-                </button>
-            {% endif %}
-            {% if perms.dcim.add_interface %}
-                <div class="float-end">
-                    <a href="{% url 'dcim:interface_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_interfaces' pk=object.pk %}" class="btn btn-primary btn-sm">
-                        <i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Interfaces
-                    </a>
-                </div>
-            {% endif %}
-            <div class="clearfix"></div>
+    </div>
+    {% render_table interface_table 'inc/table.html' %}
+    <div class="noprint">
+        {% if perms.dcim.change_interface %}
+            <button type="submit" name="_rename" formaction="{% url 'dcim:interface_bulk_rename' %}?return_url={% url 'dcim:device_interfaces' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
+                <i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
+            </button>
+            <button type="submit" name="_edit" formaction="{% url 'dcim:interface_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_interfaces' pk=object.pk %}" class="btn btn-warning btn-sm">
+                <i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
+            </button>
+            <button type="submit" name="_disconnect" formaction="{% url 'dcim:interface_bulk_disconnect' %}?return_url={% url 'dcim:device_interfaces' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
+                <span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
+            </button>
+        {% endif %}
+        {% if perms.dcim.delete_interface %}
+            <button type="submit" name="_delete" formaction="{% url 'dcim:interface_bulk_delete' %}?return_url={% url 'dcim:device_interfaces' pk=object.pk %}" class="btn btn-danger btn-sm">
+                <i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
+            </button>
+        {% endif %}
+        {% if perms.dcim.add_interface %}
+            <div class="float-end">
+                <a href="{% url 'dcim:interface_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_interfaces' pk=object.pk %}" class="btn btn-primary btn-sm">
+                    <i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Interfaces
+                </a>
             </div>
+        {% endif %}
+        <div class="clearfix"></div>
     </div>
-</form>
-{% include 'inc/paginator.html' with paginator=interface_table.paginator page=interface_table.page %}
-{% table_config_form interface_table %}
+  </form>
+  {% include 'inc/paginator.html' with paginator=interface_table.paginator page=interface_table.page %}
+  {% table_config_form interface_table %}
 {% endblock %}

+ 30 - 38
netbox/templates/dcim/device/inventory.html

@@ -4,45 +4,37 @@
 {% load static %}
 
 {% block content %}
-<form method="post">
+  <form method="post">
     {% csrf_token %}
-    <div class="card">
-        <div class="card-header">
-            <h5 class="d-inline">Inventory Items</h5>
-            <div class="float-end noprint">
-                {% if request.user.is_authenticated %}
-                    <button type="button" class="btn btn-outline-dark btn-sm" data-bs-toggle="modal" data-bs-target="#DeviceInventoryItemTable_config" title="Configure table"><i class="mdi mdi-cog"></i> Configure</button>
-                {% endif %}
+    <div class="float-end noprint">
+      {% if request.user.is_authenticated %}
+        <button type="button" class="btn btn-outline-dark btn-sm" data-bs-toggle="modal" data-bs-target="#DeviceInventoryItemTable_config" title="Configure table"><i class="mdi mdi-cog"></i> Configure</button>
+      {% endif %}
+    </div>
+    {% render_table inventoryitem_table 'inc/table.html' %}
+    <div class="noprint">
+        {% if perms.dcim.change_inventoryitem %}
+            <button type="submit" name="_rename" formaction="{% url 'dcim:inventoryitem_bulk_rename' %}?return_url={% url 'dcim:device_inventory' pk=object.pk %}" class="btn btn-warning btn-sm">
+                <i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
+            </button>
+            <button type="submit" name="_edit" formaction="{% url 'dcim:inventoryitem_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_inventory' pk=object.pk %}" class="btn btn-warning btn-sm">
+                <i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
+            </button>
+        {% endif %}
+        {% if perms.dcim.delete_inventoryitem %}
+            <button type="submit" name="_delete" formaction="{% url 'dcim:inventoryitem_bulk_delete' %}?return_url={% url 'dcim:device_inventory' pk=object.pk %}" class="btn btn-danger btn-sm">
+                <i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
+            </button>
+        {% endif %}
+        {% if perms.dcim.add_inventoryitem %}
+            <div class="float-end">
+                <a href="{% url 'dcim:inventoryitem_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_inventory' pk=object.pk %}" class="btn btn-primary btn-sm">
+                    <i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Inventory Item
+                </a>
             </div>
-        </div>
-        <div class="card-body">
-            {% render_table inventoryitem_table 'inc/table.html' %}
-        </div>
-        <div class="card-footer noprint">
-            {% if perms.dcim.change_inventoryitem %}
-                <button type="submit" name="_rename" formaction="{% url 'dcim:inventoryitem_bulk_rename' %}?return_url={% url 'dcim:device_inventory' pk=object.pk %}" class="btn btn-warning btn-sm">
-                    <i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
-                </button>
-                <button type="submit" name="_edit" formaction="{% url 'dcim:inventoryitem_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_inventory' pk=object.pk %}" class="btn btn-warning btn-sm">
-                    <i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
-                </button>
-            {% endif %}
-            {% if perms.dcim.delete_inventoryitem %}
-                <button type="submit" name="_delete" formaction="{% url 'dcim:inventoryitem_bulk_delete' %}?return_url={% url 'dcim:device_inventory' pk=object.pk %}" class="btn btn-danger btn-sm">
-                    <i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
-                </button>
-            {% endif %}
-            {% if perms.dcim.add_inventoryitem %}
-                <div class="float-end">
-                    <a href="{% url 'dcim:inventoryitem_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_inventory' pk=object.pk %}" class="btn btn-primary btn-sm">
-                        <i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Inventory Item
-                    </a>
-                </div>
-            {% endif %}
-        </div>
+        {% endif %}
     </div>
-</form>
-{% include 'inc/paginator.html' with paginator=inventoryitem_table.paginator page=inventoryitem_table.page %}
-{% table_config_form inventoryitem_table %}
+  </form>
+  {% include 'inc/paginator.html' with paginator=inventoryitem_table.paginator page=inventoryitem_table.page %}
+  {% table_config_form inventoryitem_table %}
 {% endblock %}
-

+ 34 - 41
netbox/templates/dcim/device/poweroutlets.html

@@ -4,48 +4,41 @@
 {% load static %}
 
 {% block content %}
-<form method="post">
+  <form method="post">
     {% csrf_token %}
-    <div class="card">
-        <div class="card-header">
-            <h5 class="d-inline">Power Outlets</h5>
-            <div class="float-end noprint">
-            {% if request.user.is_authenticated %}
-                <button type="button" class="btn btn-outline-dark btn-sm" data-bs-toggle="modal" data-bs-target="#DevicePowerOutletTable_config" title="Configure table"><i class="mdi mdi-cog"></i> Configure</button>
-            {% endif %}
+    <div class="float-end noprint">
+      {% if request.user.is_authenticated %}
+        <button type="button" class="btn btn-outline-dark btn-sm" data-bs-toggle="modal" data-bs-target="#DevicePowerOutletTable_config" title="Configure table"><i class="mdi mdi-cog"></i> Configure</button>
+      {% endif %}
+    </div>
+    {% render_table poweroutlet_table 'inc/table.html' %}
+    <div class="noprint">
+        {% if perms.dcim.change_powerport %}
+            <button type="submit" name="_rename" formaction="{% url 'dcim:poweroutlet_bulk_rename' %}?return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
+                <i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
+            </button>
+            <button type="submit" name="_edit" formaction="{% url 'dcim:poweroutlet_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}" class="btn btn-warning btn-sm">
+                <i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
+            </button>
+            <button type="submit" name="_disconnect" formaction="{% url 'dcim:poweroutlet_bulk_disconnect' %}?return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
+                <span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
+            </button>
+        {% endif %}
+        {% if perms.dcim.delete_poweroutlet %}
+            <button type="submit" formaction="{% url 'dcim:poweroutlet_bulk_delete' %}?return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}" class="btn btn-danger btn-sm">
+                <i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
+            </button>
+        {% endif %}
+        {% if perms.dcim.add_poweroutlet %}
+            <div class="float-end">
+                <a href="{% url 'dcim:poweroutlet_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}" class="btn btn-primary btn-sm">
+                    <i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Power Outlets
+                </a>
             </div>
-        </div>
-        <div class="card-body">
-            {% render_table poweroutlet_table 'inc/table.html' %}
-        </div>
-        <div class="card-footer noprint">
-            {% if perms.dcim.change_powerport %}
-                <button type="submit" name="_rename" formaction="{% url 'dcim:poweroutlet_bulk_rename' %}?return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
-                    <i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
-                </button>
-                <button type="submit" name="_edit" formaction="{% url 'dcim:poweroutlet_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}" class="btn btn-warning btn-sm">
-                    <i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
-                </button>
-                <button type="submit" name="_disconnect" formaction="{% url 'dcim:poweroutlet_bulk_disconnect' %}?return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
-                    <span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
-                </button>
-            {% endif %}
-            {% if perms.dcim.delete_poweroutlet %}
-                <button type="submit" formaction="{% url 'dcim:poweroutlet_bulk_delete' %}?return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}" class="btn btn-danger btn-sm">
-                    <i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
-                </button>
-            {% endif %}
-            {% if perms.dcim.add_poweroutlet %}
-                <div class="float-end">
-                    <a href="{% url 'dcim:poweroutlet_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}" class="btn btn-primary btn-sm">
-                        <i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Power Outlets
-                    </a>
-                </div>
-            {% endif %}
-            <div class="clearfix"></div>
-        </div>
+        {% endif %}
+        <div class="clearfix"></div>
     </div>
-</form>
-{% include 'inc/paginator.html' with paginator=poweroutlet_table.paginator page=poweroutlet_table.page %}
-{% table_config_form poweroutlet_table %}
+  </form>
+  {% include 'inc/paginator.html' with paginator=poweroutlet_table.paginator page=poweroutlet_table.page %}
+  {% table_config_form poweroutlet_table %}
 {% endblock %}

+ 34 - 40
netbox/templates/dcim/device/powerports.html

@@ -4,47 +4,41 @@
 {% load static %}
 
 {% block content %}
-<form method="post">
+  <form method="post">
     {% csrf_token %}
-    <div class="card">
-        <div class="card-header">
-            <h5 class="d-inline">Power Ports</h5>
-            <div class="float-end noprint">
-            {% if request.user.is_authenticated %}
-                <button type="button" class="btn btn-outline-dark btn-sm" data-bs-toggle="modal" data-bs-target="#DevicePowerPortTable_config" title="Configure table"><i class="mdi mdi-cog"></i> Configure</button>
-            {% endif %}
+    <div class="float-end noprint">
+      {% if request.user.is_authenticated %}
+        <button type="button" class="btn btn-outline-dark btn-sm" data-bs-toggle="modal" data-bs-target="#DevicePowerPortTable_config" title="Configure table"><i class="mdi mdi-cog"></i> Configure</button>
+      {% endif %}
+    </div>
+    {% render_table powerport_table 'inc/table.html' %}
+    <div class="noprint">
+        {% if perms.dcim.change_powerport %}
+            <button type="submit" name="_rename" formaction="{% url 'dcim:powerport_bulk_rename' %}?return_url={% url 'dcim:device_powerports' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
+                <i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
+            </button>
+            <button type="submit" name="_edit" formaction="{% url 'dcim:powerport_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_powerports' pk=object.pk %}" class="btn btn-warning btn-sm">
+                <i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
+            </button>
+            <button type="submit" name="_disconnect" formaction="{% url 'dcim:powerport_bulk_disconnect' %}?return_url={% url 'dcim:device_powerports' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
+                <span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
+            </button>
+        {% endif %}
+        {% if perms.dcim.delete_powerport %}
+            <button type="submit" name="_delete" formaction="{% url 'dcim:powerport_bulk_delete' %}?return_url={% url 'dcim:device_powerports' pk=object.pk %}" class="btn btn-danger btn-sm">
+                <i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
+            </button>
+        {% endif %}
+        {% if perms.dcim.add_powerport %}
+            <div class="float-end">
+                <a href="{% url 'dcim:powerport_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_powerports' pk=object.pk %}" class="btn btn-sm btn-primary">
+                    <i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add power port
+                </a>
             </div>
-        </div>
-        <div class="card-body">
-            {% render_table powerport_table 'inc/table.html' %}
-        </div>
-        <div class="card-footer noprint">
-            {% if perms.dcim.change_powerport %}
-                <button type="submit" name="_rename" formaction="{% url 'dcim:powerport_bulk_rename' %}?return_url={% url 'dcim:device_powerports' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
-                    <i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
-                </button>
-                <button type="submit" name="_edit" formaction="{% url 'dcim:powerport_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_powerports' pk=object.pk %}" class="btn btn-warning btn-sm">
-                    <i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
-                </button>
-                <button type="submit" name="_disconnect" formaction="{% url 'dcim:powerport_bulk_disconnect' %}?return_url={% url 'dcim:device_powerports' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
-                    <span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
-                </button>
-            {% endif %}
-            {% if perms.dcim.delete_powerport %}
-                <button type="submit" name="_delete" formaction="{% url 'dcim:powerport_bulk_delete' %}?return_url={% url 'dcim:device_powerports' pk=object.pk %}" class="btn btn-danger btn-sm">
-                    <i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
-                </button>
-            {% endif %}
-            {% if perms.dcim.add_powerport %}
-                <div class="float-end">
-                    <a href="{% url 'dcim:powerport_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_powerports' pk=object.pk %}" class="btn btn-sm btn-primary">
-                        <i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add power port
-                    </a>
-                </div>
-            {% endif %}
-        </div>
+        {% endif %}
+        <div class="clearfix"></div>
     </div>
-</form>
-{% include 'inc/paginator.html' with paginator=powerport_table.paginator page=powerport_table.page %}
-{% table_config_form powerport_table %}
+  </form>
+  {% include 'inc/paginator.html' with paginator=powerport_table.paginator page=powerport_table.page %}
+  {% table_config_form powerport_table %}
 {% endblock %}

+ 36 - 43
netbox/templates/dcim/device/rearports.html

@@ -4,48 +4,41 @@
 {% load helpers %}
 
 {% block content %}
-    <form method="post">
-        {% csrf_token %}
-        <div class="card">
-            <div class="card-header">
-                <h5>Rear Ports</h5>
-                <div class="float-end noprint">
-                {% if request.user.is_authenticated %}
-                    <button type="button" class="btn btn-outline-dark btn-sm" data-bs-toggle="modal" data-bs-target="#DeviceRearPortTable_config" title="Configure table"><i class="mdi mdi-cog"></i> Configure</button>
-                {% endif %}
-                </div>
+  <form method="post">
+    {% csrf_token %}
+    <div class="float-end noprint">
+      {% if request.user.is_authenticated %}
+        <button type="button" class="btn btn-outline-dark btn-sm" data-bs-toggle="modal" data-bs-target="#DeviceRearPortTable_config" title="Configure table"><i class="mdi mdi-cog"></i> Configure</button>
+      {% endif %}
+    </div>
+    {% render_table rearport_table 'inc/table.html' %}
+    <div class="noprint">
+        {% if perms.dcim.change_rearport %}
+            <button type="submit" name="_rename" formaction="{% url 'dcim:rearport_bulk_rename' %}?return_url={% url 'dcim:device_rearports' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
+                <i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
+            </button>
+            <button type="submit" name="_edit" formaction="{% url 'dcim:rearport_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_rearports' pk=object.pk %}" class="btn btn-warning btn-sm">
+                <i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
+            </button>
+            <button type="submit" name="_disconnect" formaction="{% url 'dcim:rearport_bulk_disconnect' %}?return_url={% url 'dcim:device_rearports' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
+                <span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
+            </button>
+        {% endif %}
+        {% if perms.dcim.delete_rearport %}
+            <button type="submit" formaction="{% url 'dcim:rearport_bulk_delete' %}?return_url={% url 'dcim:device_rearports' pk=object.pk %}" class="btn btn-danger btn-sm">
+                <i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
+            </button>
+        {% endif %}
+        {% if perms.dcim.add_rearport %}
+            <div class="float-end">
+                <a href="{% url 'dcim:rearport_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_rearports' pk=object.pk %}" class="btn btn-primary btn-sm">
+                    <i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add rear ports
+                </a>
             </div>
-            <div class="card-body">
-                {% render_table rearport_table 'inc/table.html' %}
-            </div>
-            <div class="card-footer noprint">
-                {% if perms.dcim.change_rearport %}
-                    <button type="submit" name="_rename" formaction="{% url 'dcim:rearport_bulk_rename' %}?return_url={% url 'dcim:device_rearports' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
-                        <i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
-                    </button>
-                    <button type="submit" name="_edit" formaction="{% url 'dcim:rearport_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_rearports' pk=object.pk %}" class="btn btn-warning btn-sm">
-                        <i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
-                    </button>
-                    <button type="submit" name="_disconnect" formaction="{% url 'dcim:rearport_bulk_disconnect' %}?return_url={% url 'dcim:device_rearports' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
-                        <span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
-                    </button>
-                {% endif %}
-                {% if perms.dcim.delete_rearport %}
-                    <button type="submit" formaction="{% url 'dcim:rearport_bulk_delete' %}?return_url={% url 'dcim:device_rearports' pk=object.pk %}" class="btn btn-danger btn-sm">
-                        <i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
-                    </button>
-                {% endif %}
-                {% if perms.dcim.add_rearport %}
-                    <div class="float-end">
-                        <a href="{% url 'dcim:rearport_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_rearports' pk=object.pk %}" class="btn btn-primary btn-sm">
-                            <i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add rear ports
-                        </a>
-                    </div>
-                {% endif %}
-                <div class="clearfix"></div>
-            </div>
-        </div>
-    </form>
-    {% include 'inc/paginator.html' with paginator=rearport_table.paginator page=rearport_table.page %}
-    {% table_config_form rearport_table %}
+        {% endif %}
+        <div class="clearfix"></div>
+    </div>
+  </form>
+  {% include 'inc/paginator.html' with paginator=rearport_table.paginator page=rearport_table.page %}
+  {% table_config_form rearport_table %}
 {% endblock %}

+ 14 - 26
netbox/templates/virtualization/virtualmachine/base.html

@@ -17,32 +17,20 @@
   {% endif %}
 {% endblock %}
 
-{% block tabs %}
-  <ul class="nav nav-tabs">
+{% block tab_items %}
+  <li class="nav-item" role="presentation">
+    <a class="nav-link{% if not active_tab %} active{% endif %}" href="{{ object.get_absolute_url }}">Virtual Machine</a>
+  </li>
+  {% with interface_count=object.interfaces.count %}
+      {% if interface_count %}
+          <li class="nav-item" role="presentation">
+              <a class="nav-link{% if active_tab == 'interfaces' %} active{% endif %}" href="{% url 'virtualization:virtualmachine_interfaces' pk=object.pk %}">Interfaces {% badge interface_count %}</a>
+          </li>
+      {% endif %}
+  {% endwith %}
+  {% if perms.extras.view_configcontext %}
     <li class="nav-item" role="presentation">
-      <a class="nav-link{% if not active_tab %} active{% endif %}" href="{{ object.get_absolute_url }}">Virtual Machine</a>
+      <a class="nav-link{% if active_tab == 'config-context' %} active{% endif %}" href="{% url 'virtualization:virtualmachine_configcontext' pk=object.pk %}">Config Context</a>
     </li>
-    {% with interface_count=object.interfaces.count %}
-        {% if interface_count %}
-            <li class="nav-item" role="presentation">
-                <a class="nav-link{% if active_tab == 'interfaces' %} active{% endif %}" href="{% url 'virtualization:virtualmachine_interfaces' pk=object.pk %}">Interfaces {% badge interface_count %}</a>
-            </li>
-        {% endif %}
-    {% endwith %}
-    {% if perms.extras.view_configcontext %}
-      <li class="nav-item" role="presentation">
-        <a class="nav-link{% if active_tab == 'config-context' %} active{% endif %}" href="{% url 'virtualization:virtualmachine_configcontext' pk=object.pk %}">Config Context</a>
-      </li>
-    {% endif %}
-    {% if perms.extras.view_journalentry %}
-      <li class="nav-item" role="presentation">
-        <a class="nav-link{% if active_tab == 'journal' %} active{% endif %}" href="{% url 'virtualization:virtualmachine_journal' pk=object.pk %}">Journal</a>
-      </li>
-    {% endif %}
-    {% if perms.extras.view_objectchange %}
-      <li class="nav-item" role="presentation">
-        <a class="nav-link{% if active_tab == 'changelog' %} active{% endif %}" href="{% url 'virtualization:virtualmachine_changelog' pk=object.pk %}">Change Log</a>
-      </li>
-    {% endif %}
-  </ul>
+  {% endif %}
 {% endblock %}

+ 35 - 42
netbox/templates/virtualization/virtualmachine/interfaces.html

@@ -4,47 +4,40 @@
 {% load static %}
 
 {% block content %}
-    <form method="post">
-        {% csrf_token %}
-        <div class="card my-3">
-            <div class="card-header">
-                <h5>Interfaces</h5>
-                <div class="float-end col-md-2 noprint table-controls">
-                    <div class="input-group input-group-sm">
-                        <input type="text" class="form-control interface-filter" placeholder="Filter" title="Filter text (regular expressions supported)" />
-                        {% if request.user.is_authenticated %}
-                            <button type="button" class="btn btn-outline-dark btn-sm" data-bs-toggle="modal" data-bs-target="#VirtualMachineVMInterfaceTable_config" title="Configure Table"><i class="mdi mdi-table-eye"></i></button>
-                        {% endif %}
-                    </div>
-                </div>
-            </div>
-            <div class="card-body">
-                {% render_table interface_table 'inc/table.html' %}
-            </div>
-            <div class="card-footer noprint">
-                {% if perms.virtualization.change_vminterface %}
-                    <button type="submit" name="_rename" formaction="{% url 'virtualization:vminterface_bulk_rename' %}?return_url={% url 'virtualization:virtualmachine_interfaces' pk=object.pk %}" class="btn btn-warning btn-sm">
-                        <span class="mdi mdi-pencil" aria-hidden="true"></span> Rename
-                    </button>
-                    <button type="submit" name="_edit" formaction="{% url 'virtualization:vminterface_bulk_edit' %}?virtualmachine={{ object.pk }}&return_url={% url 'virtualization:virtualmachine_interfaces' pk=object.pk %}" class="btn btn-warning btn-sm">
-                        <span class="mdi mdi-pencil" aria-hidden="true"></span> Edit
-                    </button>
-                {% endif %}
-                {% if perms.virtualization.delete_vminterface %}
-                    <button type="submit" name="_delete" formaction="{% url 'virtualization:vminterface_bulk_delete' %}?return_url={% url 'virtualization:virtualmachine_interfaces' pk=object.pk %}" class="btn btn-danger btn-sm">
-                        <span class="mdi mdi-trash-can-outline" aria-hidden="true"></span> Delete
-                    </button>
-                {% endif %}
-                {% if perms.virtualization.add_vminterface %}
-                    <div class="float-end">
-                        <a href="{% url 'virtualization:vminterface_add' %}?virtual_machine={{ object.pk }}&return_url={% url 'virtualization:virtualmachine_interfaces' pk=object.pk %}" class="btn btn-primary btn-sm">
-                            <span class="mdi mdi-plus-thick" aria-hidden="true"></span> Add interfaces
-                        </a>
-                    </div>
-                {% endif %}
-                <div class="clearfix"></div>
-             </div>
+  <form method="post">
+    {% csrf_token %}
+    <div class="float-end col-md-4 noprint table-controls mw-33">
+        <div class="input-group input-group-sm">
+            <input type="text" class="form-control interface-filter" placeholder="Filter" title="Filter text (regular expressions supported)" />
+            {% if request.user.is_authenticated %}
+                <button type="button" class="btn btn-outline-dark btn-sm" data-bs-toggle="modal" data-bs-target="#VirtualMachineVMInterfaceTable_config" title="Configure Table"><i class="mdi mdi-table-eye"></i></button>
+            {% endif %}
         </div>
-    </form>
-    {% table_config_form interface_table %}
+    </div>
+    {% render_table interface_table 'inc/table.html' %}
+    <div class="noprint">
+        {% if perms.virtualization.change_vminterface %}
+            <button type="submit" name="_rename" formaction="{% url 'virtualization:vminterface_bulk_rename' %}?return_url={% url 'virtualization:virtualmachine_interfaces' pk=object.pk %}" class="btn btn-warning btn-sm">
+                <span class="mdi mdi-pencil" aria-hidden="true"></span> Rename
+            </button>
+            <button type="submit" name="_edit" formaction="{% url 'virtualization:vminterface_bulk_edit' %}?virtualmachine={{ object.pk }}&return_url={% url 'virtualization:virtualmachine_interfaces' pk=object.pk %}" class="btn btn-warning btn-sm">
+                <span class="mdi mdi-pencil" aria-hidden="true"></span> Edit
+            </button>
+        {% endif %}
+        {% if perms.virtualization.delete_vminterface %}
+            <button type="submit" name="_delete" formaction="{% url 'virtualization:vminterface_bulk_delete' %}?return_url={% url 'virtualization:virtualmachine_interfaces' pk=object.pk %}" class="btn btn-danger btn-sm">
+                <span class="mdi mdi-trash-can-outline" aria-hidden="true"></span> Delete
+            </button>
+        {% endif %}
+        {% if perms.virtualization.add_vminterface %}
+            <div class="float-end">
+                <a href="{% url 'virtualization:vminterface_add' %}?virtual_machine={{ object.pk }}&return_url={% url 'virtualization:virtualmachine_interfaces' pk=object.pk %}" class="btn btn-primary btn-sm">
+                    <span class="mdi mdi-plus-thick" aria-hidden="true"></span> Add interfaces
+                </a>
+            </div>
+        {% endif %}
+        <div class="clearfix"></div>
+     </div>
+  </form>
+  {% table_config_form interface_table %}
 {% endblock %}