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

Relocate "add" buttons for embedded object tables

Jeremy Stretch 2 лет назад
Родитель
Сommit
694a7d243a

+ 28 - 22
netbox/templates/dcim/device.html

@@ -115,7 +115,14 @@
             </div>
             </div>
             {% if vc_members %}
             {% if vc_members %}
                 <div class="card">
                 <div class="card">
-                    <h5 class="card-header">{% trans "Virtual Chassis" %}</h5>
+                    <h5 class="card-header">
+                      {% trans "Virtual Chassis" %}
+                      <div class="card-actions">
+                        <a href="{{ object.virtual_chassis.get_absolute_url }}" class="btn btn-ghost-primary btn-sm">
+                          <span class="mdi mdi-arrow-right-bold" aria-hidden="true"></span> {% trans "View Virtual Chassis" %}
+                        </a>
+                      </div>
+                    </h5>
                     <table class="table table-hover attr-table">
                     <table class="table table-hover attr-table">
                         <tr>
                         <tr>
                             <th>{% trans "Device" %}</th>
                             <th>{% trans "Device" %}</th>
@@ -140,26 +147,23 @@
                             </tr>
                             </tr>
                         {% endfor %}
                         {% endfor %}
                     </table>
                     </table>
-                    <div class="card-footer text-end d-print-none">
-                        <a href="{{ object.virtual_chassis.get_absolute_url }}" class="btn btn-primary">
-                            <span class="mdi mdi-arrow-right-bold" aria-hidden="true"></span> {% trans "View Virtual Chassis" %}
-                        </a>
-                    </div>
                 </div>
                 </div>
             {% endif %}
             {% endif %}
             {% include 'inc/panels/custom_fields.html' %}
             {% include 'inc/panels/custom_fields.html' %}
             {% include 'inc/panels/tags.html' %}
             {% include 'inc/panels/tags.html' %}
             {% include 'inc/panels/comments.html' %}
             {% include 'inc/panels/comments.html' %}
             <div class="card">
             <div class="card">
-              <h5 class="card-header">{% trans "Virtual Device Contexts" %}</h5>
+              <h5 class="card-header">
+                {% trans "Virtual Device Contexts" %}
+                {% if perms.dcim.add_virtualdevicecontext %}
+                  <div class="card-actions">
+                    <a href="{% url 'dcim:virtualdevicecontext_add' %}?device={{ object.pk }}" class="btn btn-ghost-primary btn-sm">
+                      <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Create VDC" %}
+                    </a>
+                  </div>
+                {% endif %}
+              </h5>
               {% htmx_table 'dcim:virtualdevicecontext_list' device_id=object.pk %}
               {% htmx_table 'dcim:virtualdevicecontext_list' device_id=object.pk %}
-              {% if perms.dcim.add_virtualdevicecontext %}
-                <div class="card-footer text-end d-print-none">
-                  <a href="{% url 'dcim:virtualdevicecontext_add' %}?device={{ object.pk }}" class="btn btn-primary">
-                    <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Create VDC" %}
-                  </a>
-                </div>
-              {% endif %}
             </div>
             </div>
             {% plugin_left_page object %}
             {% plugin_left_page object %}
         </div>
         </div>
@@ -286,15 +290,17 @@
                 </div>
                 </div>
             {% endif %}
             {% endif %}
             <div class="card">
             <div class="card">
-              <h5 class="card-header">{% trans "Services" %}</h5>
+              <h5 class="card-header">
+                {% trans "Services" %}
+                {% if perms.ipam.add_service %}
+                  <div class="card-actions">
+                    <a href="{% url 'ipam:service_add' %}?device={{ object.pk }}" class="btn btn-ghost-primary btn-sm">
+                      <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Add a service" %}
+                    </a>
+                  </div>
+                {% endif %}
+              </h5>
               {% htmx_table 'ipam:service_list' device_id=object.pk %}
               {% htmx_table 'ipam:service_list' device_id=object.pk %}
-              {% if perms.ipam.add_service %}
-                <div class="card-footer text-end d-print-none">
-                  <a href="{% url 'ipam:service_add' %}?device={{ object.pk }}" class="btn btn-primary">
-                    <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Add a service" %}
-                  </a>
-                </div>
-              {% endif %}
             </div>
             </div>
             {% include 'inc/panels/image_attachments.html' %}
             {% include 'inc/panels/image_attachments.html' %}
             <div class="card">
             <div class="card">

+ 0 - 1
netbox/templates/dcim/devicetype/component_templates.html

@@ -8,7 +8,6 @@
     <form method="post">
     <form method="post">
         {% csrf_token %}
         {% csrf_token %}
         <div class="card">
         <div class="card">
-            <h5 class="card-header">{{ title }}</h5>
             <div class="htmx-container table-responsive" id="object_list">
             <div class="htmx-container table-responsive" id="object_list">
               {% include 'htmx/table.html' %}
               {% include 'htmx/table.html' %}
             </div>
             </div>

+ 10 - 8
netbox/templates/dcim/inc/panels/inventory_items.html

@@ -2,7 +2,16 @@
 {% load i18n %}
 {% load i18n %}
 
 
 <div class="card">
 <div class="card">
-  <h5 class="card-header">{% trans "Inventory Items" %}</h5>
+  <h5 class="card-header">
+    {% trans "Inventory Items" %}
+    {% if perms.dcim.add_inventoryitem %}
+      <div class="card-actions">
+        <a href="{% url 'dcim:inventoryitem_add' %}?device={{ object.device.pk }}&component_type={{ object|content_type_id }}&component_id={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-ghost-primary btn-sm">
+          <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Add Inventory Item" %}
+        </a>
+      </div>
+    {% endif %}
+  </h5>
   <table class="table table-hover">
   <table class="table table-hover">
     <thead>
     <thead>
       <tr>
       <tr>
@@ -38,11 +47,4 @@
       {% endfor %}
       {% endfor %}
     </tbody>
     </tbody>
   </table>
   </table>
-  <div class="card-footer text-end d-print-none">
-    {% if perms.dcim.add_inventoryitem %}
-      <a href="{% url 'dcim:inventoryitem_add' %}?device={{ object.device.pk }}&component_type={{ object|content_type_id }}&component_id={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-primary">
-        <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Add Inventory Item" %}
-      </a>
-    {% endif %}
-  </div>
 </div>
 </div>

+ 11 - 8
netbox/templates/dcim/interface.html

@@ -335,15 +335,18 @@
   <div class="row mb-3">
   <div class="row mb-3">
     <div class="col col-md-12">
     <div class="col col-md-12">
       <div class="card">
       <div class="card">
-        <h5 class="card-header">{% trans "IP Addresses" %}</h5>
+        <h5 class="card-header">
+          {% trans "IP Addresses" %}
+          {% if perms.ipam.add_ipaddress %}
+            <div class="card-actions">
+              <a href="{% url 'ipam:ipaddress_add' %}?device={{ object.device.pk }}&interface={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-ghost-primary btn-sm">
+                <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Add IP Address" %}
+              </a>
+            </div>
+          {% endif %}
+        </h5>
         {% htmx_table 'ipam:ipaddress_list' interface_id=object.pk %}
         {% htmx_table 'ipam:ipaddress_list' interface_id=object.pk %}
-        {% if perms.ipam.add_ipaddress %}
-          <div class="card-footer text-end d-print-none">
-            <a href="{% url 'ipam:ipaddress_add' %}?device={{ object.device.pk }}&interface={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-primary">
-              <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Add IP Address" %}
-            </a>
-          </div>
-        {% endif %}
+        
       </div>
       </div>
     </div>
     </div>
   </div>
   </div>

+ 20 - 16
netbox/templates/dcim/location.html

@@ -69,26 +69,30 @@
 <div class="row mb-3">
 <div class="row mb-3">
 	<div class="col col-md-12">
 	<div class="col col-md-12">
     <div class="card">
     <div class="card">
-      <h5 class="card-header">{% trans "Child Locations" %}</h5>
+      <h5 class="card-header">
+        {% trans "Child Locations" %}
+        {% if perms.dcim.add_location %}
+          <div class="card-actions">
+            <a href="{% url 'dcim:location_add' %}?site={{ object.site.pk }}&parent={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-ghost-primary btn-sm">
+              <i class="mdi mdi-plus-thick" aria-hidden="true"></i> {% trans "Add a Location" %}
+            </a>
+          </div>
+        {% endif %}
+      </h5>
       {% htmx_table 'dcim:location_list' parent_id=object.pk %}
       {% htmx_table 'dcim:location_list' parent_id=object.pk %}
-      {% if perms.dcim.add_location %}
-        <div class="card-footer text-end d-print-none">
-          <a href="{% url 'dcim:location_add' %}?site={{ object.site.pk }}&parent={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-primary">
-            <i class="mdi mdi-plus-thick" aria-hidden="true"></i> {% trans "Add a Location" %}
-          </a>
-        </div>
-      {% endif %}
     </div>
     </div>
     <div class="card">
     <div class="card">
-      <h5 class="card-header">Non-Racked Devices</h5>
+      <h5 class="card-header">
+        {% trans "Non-Racked Devices" %}
+        {% if perms.dcim.add_device %}
+          <div class="card-actions">
+            <a href="{% url 'dcim:device_add' %}?site={{ object.site.pk }}&location={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-ghost-primary btn-sm">
+              <i class="mdi mdi-plus-thick" aria-hidden="true"></i> {% trans "Add a Device" %}
+            </a>
+          </div>
+        {% endif %}
+      </h5>
       {% htmx_table 'dcim:device_list' location_id=object.pk rack_id='null' parent_bay_id='null' %}
       {% htmx_table 'dcim:device_list' location_id=object.pk rack_id='null' parent_bay_id='null' %}
-      {% if perms.dcim.add_device %}
-        <div class="card-footer text-end d-print-none">
-          <a href="{% url 'dcim:device_add' %}?site={{ object.site.pk }}&location={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-primary">
-            <i class="mdi mdi-plus-thick" aria-hidden="true"></i> {% trans "Add a Device" %}
-          </a>
-        </div>
-      {% endif %}
     </div>
     </div>
     {% plugin_full_width_page object %}
     {% plugin_full_width_page object %}
   </div>
   </div>

+ 0 - 1
netbox/templates/dcim/moduletype/component_templates.html

@@ -8,7 +8,6 @@
     <form method="post">
     <form method="post">
         {% csrf_token %}
         {% csrf_token %}
         <div class="card">
         <div class="card">
-            <h5 class="card-header">{{ title }}</h5>
             <div class="htmx-container table-responsive" id="object_list">
             <div class="htmx-container table-responsive" id="object_list">
               {% include 'htmx/table.html' %}
               {% include 'htmx/table.html' %}
             </div>
             </div>

+ 10 - 8
netbox/templates/dcim/region.html

@@ -51,15 +51,17 @@
 <div class="row mb-3">
 <div class="row mb-3">
 	<div class="col col-md-12">
 	<div class="col col-md-12">
     <div class="card">
     <div class="card">
-      <h5 class="card-header">{% trans "Child Regions" %}</h5>
+      <h5 class="card-header">
+        {% trans "Child Regions" %}
+        {% if perms.dcim.add_region %}
+          <div class="card-actions">
+            <a href="{% url 'dcim:region_add' %}?parent={{ object.pk }}" class="btn btn-ghost-primary btn-sm">
+              <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Add Region" %}
+            </a>
+          </div>
+        {% endif %}
+      </h5>
       {% htmx_table 'dcim:region_list' parent_id=object.pk %}
       {% htmx_table 'dcim:region_list' parent_id=object.pk %}
-      {% if perms.dcim.add_region %}
-        <div class="card-footer text-end d-print-none">
-          <a href="{% url 'dcim:region_add' %}?parent={{ object.pk }}" class="btn btn-primary">
-            <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Add Region" %}
-          </a>
-        </div>
-      {% endif %}
     </div>
     </div>
     {% plugin_full_width_page object %}
     {% plugin_full_width_page object %}
   </div>
   </div>

+ 20 - 16
netbox/templates/dcim/site.html

@@ -122,26 +122,30 @@
 <div class="row">
 <div class="row">
   <div class="col col-md-12">
   <div class="col col-md-12">
     <div class="card">
     <div class="card">
-      <h5 class="card-header">Locations</h5>
+      <h5 class="card-header">
+        {% trans "Locations" %}
+        {% if perms.dcim.add_location %}
+          <div class="card-actions">
+            <a href="{% url 'dcim:location_add' %}?site={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-ghost-primary btn-sm">
+              <i class="mdi mdi-plus-thick" aria-hidden="true"></i> {% trans "Add a Location" %}
+            </a>
+          </div>
+        {% endif %}
+      </h5>
       {% htmx_table 'dcim:location_list' site_id=object.pk %}
       {% htmx_table 'dcim:location_list' site_id=object.pk %}
-      {% if perms.dcim.add_location %}
-        <div class="card-footer text-end d-print-none">
-          <a href="{% url 'dcim:location_add' %}?site={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-primary">
-            <i class="mdi mdi-plus-thick" aria-hidden="true"></i> {% trans "Add a Location" %}
-          </a>
-        </div>
-      {% endif %}
     </div>
     </div>
     <div class="card">
     <div class="card">
-      <h5 class="card-header">Non-Racked Devices</h5>
+      <h5 class="card-header">
+        {% trans "Non-Racked Devices" %}
+        {% if perms.dcim.add_device %}
+          <div class="card-actions">
+            <a href="{% url 'dcim:device_add' %}?site={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-ghost-primary btn-sm">
+              <i class="mdi mdi-plus-thick" aria-hidden="true"></i> {% trans "Add a Device" %}
+            </a>
+          </div>
+        {% endif %}
+      </h5>
       {% htmx_table 'dcim:device_list' site_id=object.pk rack_id='null' parent_bay_id='null' %}
       {% htmx_table 'dcim:device_list' site_id=object.pk rack_id='null' parent_bay_id='null' %}
-      {% if perms.dcim.add_device %}
-        <div class="card-footer text-end d-print-none">
-          <a href="{% url 'dcim:device_add' %}?site={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-primary">
-            <i class="mdi mdi-plus-thick" aria-hidden="true"></i> {% trans "Add a Device" %}
-          </a>
-        </div>
-      {% endif %}
     </div>
     </div>
     {% plugin_full_width_page object %}
     {% plugin_full_width_page object %}
   </div>
   </div>

+ 10 - 8
netbox/templates/dcim/sitegroup.html

@@ -51,15 +51,17 @@
 <div class="row mb-3">
 <div class="row mb-3">
 	<div class="col col-md-12">
 	<div class="col col-md-12">
     <div class="card">
     <div class="card">
-      <h5 class="card-header">{% trans "Child Groups" %}</h5>
+      <h5 class="card-header">
+        {% trans "Child Groups" %}
+        {% if perms.dcim.add_sitegroup %}
+          <div class="card-actions">
+            <a href="{% url 'dcim:sitegroup_add' %}?parent={{ object.pk }}" class="btn btn-ghost-primary btn-sm">
+              <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Add Site Group" %}
+            </a>
+          </div>
+        {% endif %}
+      </h5>
       {% htmx_table 'dcim:sitegroup_list' parent_id=object.pk %}
       {% htmx_table 'dcim:sitegroup_list' parent_id=object.pk %}
-      {% if perms.dcim.add_sitegroup %}
-        <div class="card-footer text-end d-print-none">
-          <a href="{% url 'dcim:sitegroup_add' %}?parent={{ object.pk }}" class="btn btn-primary">
-            <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Add Site Group" %}
-          </a>
-        </div>
-      {% endif %}
     </div>
     </div>
     {% plugin_full_width_page object %}
     {% plugin_full_width_page object %}
   </div>
   </div>

+ 10 - 8
netbox/templates/dcim/virtualchassis.html

@@ -49,7 +49,16 @@
     </div>
     </div>
     <div class="col col-md-8">
     <div class="col col-md-8">
       <div class="card">
       <div class="card">
-        <h5 class="card-header">{% trans "Members" %}</h5>
+        <h5 class="card-header">
+          {% trans "Members" %}
+          {% if perms.dcim.change_virtualchassis %}
+            <div class="card-actions">
+              <a href="{% url 'dcim:virtualchassis_add_member' pk=object.pk %}?site={{ object.master.site.pk }}&rack={{ object.master.rack.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-ghost-primary btn-sm">
+                <i class="mdi mdi-plus-thick" aria-hidden="true"></i> {% trans "Add Member" %}
+              </a>
+            </div>
+          {% endif %}
+        </h5>
         <table class="table table-hover object-list">
         <table class="table table-hover object-list">
           <thead>
           <thead>
             <tr>
             <tr>
@@ -78,13 +87,6 @@
             </tr>
             </tr>
           {% endfor %}
           {% endfor %}
         </table>
         </table>
-        {% if perms.dcim.change_virtualchassis %}
-          <div class="card-footer text-end d-print-none">
-            <a href="{% url 'dcim:virtualchassis_add_member' pk=object.pk %}?site={{ object.master.site.pk }}&rack={{ object.master.rack.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-primary">
-              <i class="mdi mdi-plus-thick" aria-hidden="true"></i> {% trans "Add Member" %}
-            </a>
-          </div>
-        {% endif %}
       </div>
       </div>
       {% include 'inc/panels/comments.html' %}
       {% include 'inc/panels/comments.html' %}
       {% plugin_right_page object %}
       {% plugin_right_page object %}

+ 10 - 8
netbox/templates/inc/panels/image_attachments.html

@@ -2,13 +2,15 @@
 {% load i18n %}
 {% load i18n %}
 
 
 <div class="card">
 <div class="card">
-  <h5 class="card-header">{% trans "Images" %}</h5>
+  <h5 class="card-header">
+    {% trans "Images" %}
+    {% if perms.extras.add_imageattachment %}
+      <div class="card-actions">
+        <a href="{% url 'extras:imageattachment_add' %}?content_type={{ object|content_type_id }}&object_id={{ object.pk }}" class="btn btn-ghost-primary btn-sm">
+          <i class="mdi mdi-plus-thick" aria-hidden="true"></i> {% trans "Attach an image" %}
+        </a>
+      </div>
+    {% endif %}
+  </h5>
   {% htmx_table 'extras:imageattachment_list' content_type_id=object|content_type_id object_id=object.pk %}
   {% htmx_table 'extras:imageattachment_list' content_type_id=object|content_type_id object_id=object.pk %}
-  {% if perms.extras.add_imageattachment %}
-    <div class="card-footer text-end d-print-none">
-      <a href="{% url 'extras:imageattachment_add' %}?content_type={{ object|content_type_id }}&object_id={{ object.pk }}" class="btn btn-primary">
-        <i class="mdi mdi-plus-thick" aria-hidden="true"></i> {% trans "Attach an image" %}
-      </a>
-    </div>
-  {% endif %}
 </div>
 </div>

+ 10 - 8
netbox/templates/ipam/fhrpgroup.html

@@ -65,15 +65,17 @@
   <div class="row">
   <div class="row">
     <div class="col col-md-12">
     <div class="col col-md-12">
       <div class="card">
       <div class="card">
-        <h5 class="card-header">{% trans "Virtual IP Addresses" %}</h5>
+        <h5 class="card-header">
+          {% trans "Virtual IP Addresses" %}
+          {% if perms.ipam.add_ipaddress %}
+            <div class="card-actions">
+              <a href="{% url 'ipam:ipaddress_add' %}?fhrpgroup={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-ghost-primary btn-sm">
+                <i class="mdi mdi-plus-thick" aria-hidden="true"></i> {% trans "Add IP Address" %}
+              </a>
+            </div>
+          {% endif %}
+        </h5>
         {% htmx_table 'ipam:ipaddress_list' fhrpgroup_id=object.pk %}
         {% htmx_table 'ipam:ipaddress_list' fhrpgroup_id=object.pk %}
-        {% if perms.ipam.add_ipaddress %}
-          <div class="card-footer text-end">
-            <a href="{% url 'ipam:ipaddress_add' %}?fhrpgroup={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-primary">
-              <i class="mdi mdi-plus-thick" aria-hidden="true"></i> {% trans "Add IP Address" %}
-            </a>
-          </div>
-        {% endif %}
       </div>
       </div>
       {% include 'inc/panel_table.html' with table=members_table heading='Members' %}
       {% include 'inc/panel_table.html' with table=members_table heading='Members' %}
       {% plugin_full_width_page object %}
       {% plugin_full_width_page object %}

+ 15 - 13
netbox/templates/ipam/inc/panels/fhrp_groups.html

@@ -2,7 +2,21 @@
 {% load i18n %}
 {% load i18n %}
 
 
 <div class="card">
 <div class="card">
-  <h5 class="card-header">{% trans "FHRP Groups" %}</h5>
+  <h5 class="card-header">
+    {% trans "FHRP Groups" %}
+    <div class="card-actions">
+      {% if perms.ipam.add_fhrpgroup %}
+        <a href="{% url 'ipam:fhrpgroup_add' %}?return_url={% url 'ipam:fhrpgroupassignment_add' %}%3Finterface_type={{ object|content_type_id }}%26interface_id={{ object.pk }}" class="btn btn-ghost-primary btn-sm">
+          <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Create Group" %}
+        </a>
+      {% endif %}
+      {% if perms.ipam.add_fhrpgroupassignment %}
+        <a href="{% url 'ipam:fhrpgroupassignment_add' %}?interface_type={{ object|content_type_id }}&interface_id={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-ghost-primary btn-sm">
+          <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Assign Group" %}
+        </a>
+      {% endif %}
+    </div>
+  </h5>
   <table class="table table-hover">
   <table class="table table-hover">
     <thead>
     <thead>
       <tr>
       <tr>
@@ -44,16 +58,4 @@
       {% endfor %}
       {% endfor %}
     </tbody>
     </tbody>
   </table>
   </table>
-  <div class="card-footer text-end d-print-none">
-    {% if perms.ipam.add_fhrpgroup %}
-      <a href="{% url 'ipam:fhrpgroup_add' %}?return_url={% url 'ipam:fhrpgroupassignment_add' %}%3Finterface_type={{ object|content_type_id }}%26interface_id={{ object.pk }}" class="btn btn-primary">
-        <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Create Group" %}
-      </a>
-    {% endif %}
-    {% if perms.ipam.add_fhrpgroupassignment %}
-      <a href="{% url 'ipam:fhrpgroupassignment_add' %}?interface_type={{ object|content_type_id }}&interface_id={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-primary">
-        <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Assign Group" %}
-      </a>
-    {% endif %}
-  </div>
 </div>
 </div>

+ 10 - 8
netbox/templates/ipam/prefix.html

@@ -91,7 +91,16 @@
   </div>
   </div>
   <div class="col col-md-6">
   <div class="col col-md-6">
     <div class="card">
     <div class="card">
-      <h5 class="card-header">{% trans "Addressing" %}</h5>
+      <h5 class="card-header">
+        {% trans "Addressing" %}
+        {% if object.prefix.version == 4 %}
+          <div class="card-actions">
+            <a class="btn btn-ghost-primary btn-sm" data-bs-toggle="modal" data-bs-target="#prefix-modal">
+              <i class="mdi mdi-information-outline" aria-hidden="true"></i> {% trans "Addressing Details" %}
+            </a>
+          </div>
+        {% endif %}
+      </h5>
       <table class="table table-hover attr-table">
       <table class="table table-hover attr-table">
         <tr>
         <tr>
           <th scope="row">{% trans "Utilization" %}</th>
           <th scope="row">{% trans "Utilization" %}</th>
@@ -142,13 +151,6 @@
           </td>
           </td>
         </tr>
         </tr>
       </table>
       </table>
-      {% if object.prefix.version == 4 %}
-        <div class="card-footer text-end">
-          <a class="btn btn-primary btn-sm" data-bs-toggle="modal" data-bs-target="#prefix-modal">
-            <i class="mdi mdi-information-outline" aria-hidden="true"></i> {% trans "Addressing Details" %}
-          </a>
-        </div>
-      {% endif %}
     </div>
     </div>
     {% include 'inc/panels/custom_fields.html' %}
     {% include 'inc/panels/custom_fields.html' %}
     {% include 'inc/panels/tags.html' %}
     {% include 'inc/panels/tags.html' %}

+ 10 - 8
netbox/templates/ipam/vlan.html

@@ -80,15 +80,17 @@
     <div class="row">
     <div class="row">
       <div class="col col-md-12">
       <div class="col col-md-12">
         <div class="card">
         <div class="card">
-          <h5 class="card-header">{% trans "Prefixes" %}</h5>
+          <h5 class="card-header">
+            {% trans "Prefixes" %}
+            {% if perms.ipam.add_prefix %}
+              <div class="card-actions">
+                <a href="{% url 'ipam:prefix_add' %}?{% if object.tenant %}tenant={{ object.tenant.pk }}&{% endif %}site={{ object.site.pk }}&vlan={{ object.pk }}" class="btn btn-ghost-primary btn-sm">
+                  <i class="mdi mdi-plus-thick" aria-hidden="true"></i> {% trans "Add a Prefix" %}
+                </a>
+              </div>
+            {% endif %}
+          </h5>
           {% htmx_table 'ipam:prefix_list' vlan_id=object.pk %}
           {% htmx_table 'ipam:prefix_list' vlan_id=object.pk %}
-          {% if perms.ipam.add_prefix %}
-            <div class="card-footer text-end d-print-none">
-              <a href="{% url 'ipam:prefix_add' %}?{% if object.tenant %}tenant={{ object.tenant.pk }}&{% endif %}site={{ object.site.pk }}&vlan={{ object.pk }}" class="btn btn-primary">
-                <i class="mdi mdi-plus-thick" aria-hidden="true"></i> {% trans "Add a Prefix" %}
-              </a>
-            </div>
-          {% endif %}
         </div>
         </div>
         {% plugin_full_width_page object %}
         {% plugin_full_width_page object %}
       </div>
       </div>

+ 10 - 8
netbox/templates/tenancy/contactgroup.html

@@ -42,15 +42,17 @@
   </div>
   </div>
   <div class="col col-md-12">
   <div class="col col-md-12">
     <div class="card">
     <div class="card">
-      <h5 class="card-header">{% trans "Child Groups" %}</h5>
+      <h5 class="card-header">
+        {% trans "Child Groups" %}
+        {% if perms.tenancy.add_contactgroup %}
+          <div class="card-actions">
+            <a href="{% url 'tenancy:contactgroup_add' %}?parent={{ object.pk }}" class="btn btn-ghost-primary btn-sm">
+              <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Add Contact Group" %}
+            </a>
+          </div>
+        {% endif %}
+      </h5>
       {% htmx_table 'tenancy:contactgroup_list' parent_id=object.pk %}
       {% htmx_table 'tenancy:contactgroup_list' parent_id=object.pk %}
-      {% if perms.tenancy.add_contactgroup %}
-        <div class="card-footer text-end d-print-none">
-          <a href="{% url 'tenancy:contactgroup_add' %}?parent={{ object.pk }}" class="btn btn-primary">
-            <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Add Contact Group" %}
-          </a>
-        </div>
-      {% endif %}
     </div>
     </div>
     {% plugin_full_width_page object %}
     {% plugin_full_width_page object %}
   </div>
   </div>

+ 10 - 8
netbox/templates/tenancy/tenantgroup.html

@@ -51,15 +51,17 @@
 <div class="row mb-3">
 <div class="row mb-3">
 	<div class="col col-md-12">
 	<div class="col col-md-12">
     <div class="card">
     <div class="card">
-      <h5 class="card-header">{% trans "Child Groups" %}</h5>
+      <h5 class="card-header">
+        {% trans "Child Groups" %}
+        {% if perms.tenancy.add_tenantgroup %}
+          <div class="card-actions">
+            <a href="{% url 'tenancy:tenantgroup_add' %}?parent={{ object.pk }}" class="btn btn-ghost-primary btn-sm">
+              <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Add Tenant Group" %}
+            </a>
+          </div>
+        {% endif %}
+      </h5>
       {% htmx_table 'tenancy:tenantgroup_list' parent_id=object.pk %}
       {% htmx_table 'tenancy:tenantgroup_list' parent_id=object.pk %}
-      {% if perms.tenancy.add_tenantgroup %}
-        <div class="card-footer text-end d-print-none">
-          <a href="{% url 'tenancy:tenantgroup_add' %}?parent={{ object.pk }}" class="btn btn-primary">
-            <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Add Tenant Group" %}
-          </a>
-        </div>
-      {% endif %}
     </div>
     </div>
     {% plugin_full_width_page object %}
     {% plugin_full_width_page object %}
   </div>
   </div>

+ 20 - 16
netbox/templates/virtualization/virtualmachine.html

@@ -146,15 +146,17 @@
             </table>
             </table>
         </div>
         </div>
         <div class="card">
         <div class="card">
-          <h5 class="card-header">{% trans "Services" %}</h5>
+          <h5 class="card-header">
+            {% trans "Services" %}
+            {% if perms.ipam.add_service %}
+              <div class="card-actions">
+                <a href="{% url 'ipam:service_add' %}?virtual_machine={{ object.pk }}" class="btn btn-ghost-primary btn-sm">
+                  <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Add a service" %}
+                </a>
+              </div>
+            {% endif %}
+          </h5>
           {% htmx_table 'ipam:service_list' virtual_machine_id=object.pk %}
           {% htmx_table 'ipam:service_list' virtual_machine_id=object.pk %}
-          {% if perms.ipam.add_service %}
-            <div class="card-footer text-end d-print-none">
-              <a href="{% url 'ipam:service_add' %}?virtual_machine={{ object.pk }}" class="btn btn-primary">
-                <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Add a service" %}
-              </a>
-            </div>
-          {% endif %}
         </div>
         </div>
         {% plugin_right_page object %}
         {% plugin_right_page object %}
     </div>
     </div>
@@ -163,15 +165,17 @@
 <div class="row">
 <div class="row">
   <div class="col col-md-12">
   <div class="col col-md-12">
     <div class="card">
     <div class="card">
-      <h5 class="card-header">{% trans "Virtual Disks" %}</h5>
+      <h5 class="card-header">
+        {% trans "Virtual Disks" %}
+        {% if perms.virtualization.add_virtualdisk %}
+          <div class="card-actions">
+            <a href="{% url 'virtualization:virtualdisk_add' %}?device={{ object.device.pk }}&virtual_machine={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-ghost-primary btn-sm">
+              <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Add Virtual Disk" %}
+            </a>
+          </div>
+        {% endif %}
+      </h5>
       {% htmx_table 'virtualization:virtualdisk_list' virtual_machine_id=object.pk %}
       {% htmx_table 'virtualization:virtualdisk_list' virtual_machine_id=object.pk %}
-      {% if perms.virtualization.add_virtualdisk %}
-        <div class="card-footer text-end d-print-none">
-          <a href="{% url 'virtualization:virtualdisk_add' %}?device={{ object.device.pk }}&virtual_machine={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-primary">
-            <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Add Virtual Disk" %}
-          </a>
-        </div>
-      {% endif %}
     </div>
     </div>
   </div>
   </div>
 </div>
 </div>

+ 10 - 8
netbox/templates/virtualization/vminterface.html

@@ -81,15 +81,17 @@
 <div class="row mb-3">
 <div class="row mb-3">
     <div class="col col-md-12">
     <div class="col col-md-12">
         <div class="card">
         <div class="card">
-            <h5 class="card-header">{% trans "IP Addresses" %}</h5>
-            {% htmx_table 'ipam:ipaddress_list' vminterface_id=object.pk %}
-            {% if perms.ipam.add_ipaddress %}
-                <div class="card-footer text-end d-print-none">
-                    <a href="{% url 'ipam:ipaddress_add' %}?virtual_machine={{ object.virtual_machine.pk }}&vminterface={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-primary">
-                        <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Add IP Address" %}
-                    </a>
+            <h5 class="card-header">
+              {% trans "IP Addresses" %}
+              {% if perms.ipam.add_ipaddress %}
+                <div class="card-actions">
+                  <a href="{% url 'ipam:ipaddress_add' %}?virtual_machine={{ object.virtual_machine.pk }}&vminterface={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-ghost-primary btn-sm">
+                    <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Add IP Address" %}
+                  </a>
                 </div>
                 </div>
-            {% endif %}
+              {% endif %}
+            </h5>
+            {% htmx_table 'ipam:ipaddress_list' vminterface_id=object.pk %}
         </div>
         </div>
     </div>
     </div>
 </div>
 </div>

+ 10 - 8
netbox/templates/vpn/l2vpn.html

@@ -52,15 +52,17 @@
 <div class="row mb-3">
 <div class="row mb-3">
 	<div class="col col-md-12">
 	<div class="col col-md-12">
     <div class="card">
     <div class="card">
-      <h5 class="card-header">{% trans "Terminations" %}</h5>
+      <h5 class="card-header">
+        {% trans "Terminations" %}
+        {% if perms.vpn.add_l2vpntermination %}
+          <div class="card-actions">
+            <a href="{% url 'vpn:l2vpntermination_add' %}?l2vpn={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-ghost-primary btn-sm{% if not object.can_add_termination %} disabled" aria-disabled="true{% endif %}">
+              <i class="mdi mdi-plus-thick" aria-hidden="true"></i> {% trans "Add a Termination" %}
+            </a>
+          </div>
+        {% endif %}
+      </h5>
       {% htmx_table 'vpn:l2vpntermination_list' l2vpn_id=object.pk %}
       {% htmx_table 'vpn:l2vpntermination_list' l2vpn_id=object.pk %}
-      {% if perms.vpn.add_l2vpntermination %}
-        <div class="card-footer text-end d-print-none">
-          <a href="{% url 'vpn:l2vpntermination_add' %}?l2vpn={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-primary{% if not object.can_add_termination %} disabled" aria-disabled="true{% endif %}">
-            <i class="mdi mdi-plus-thick" aria-hidden="true"></i> {% trans "Add a Termination" %}
-          </a>
-        </div>
-      {% endif %}
     </div>
     </div>
   </div>
   </div>
 </div>
 </div>

+ 10 - 8
netbox/templates/vpn/tunnel.html

@@ -68,15 +68,17 @@
   <div class="row">
   <div class="row">
     <div class="col col-md-12">
     <div class="col col-md-12">
       <div class="card">
       <div class="card">
-        <h5 class="card-header">{% trans "Terminations" %}</h5>
+        <h5 class="card-header">
+          {% trans "Terminations" %}
+          {% if perms.vpn.add_tunneltermination %}
+            <div class="card-actions">
+              <a href="{% url 'vpn:tunneltermination_add' %}?tunnel={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-ghost-primary btn-sm">
+                <i class="mdi mdi-plus-thick" aria-hidden="true"></i> {% trans "Add a Termination" %}
+              </a>
+            </div>
+          {% endif %}
+        </h5>
         {% htmx_table 'vpn:tunneltermination_list' tunnel_id=object.pk %}
         {% htmx_table 'vpn:tunneltermination_list' tunnel_id=object.pk %}
-        {% if perms.vpn.add_tunneltermination %}
-          <div class="card-footer text-end d-print-none">
-            <a href="{% url 'vpn:tunneltermination_add' %}?tunnel={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-primary">
-              <i class="mdi mdi-plus-thick" aria-hidden="true"></i> {% trans "Add a Termination" %}
-            </a>
-          </div>
-        {% endif %}
       </div>
       </div>
       {% plugin_full_width_page object %}
       {% plugin_full_width_page object %}
     </div>
     </div>

+ 10 - 8
netbox/templates/wireless/wirelesslangroup.html

@@ -51,15 +51,17 @@
 <div class="row mb-3">
 <div class="row mb-3">
 	<div class="col col-md-12">
 	<div class="col col-md-12">
     <div class="card">
     <div class="card">
-      <h5 class="card-header">{% trans "Child Groups" %}</h5>
+      <h5 class="card-header">
+        {% trans "Child Groups" %}
+        {% if perms.wireless.add_wirelesslangroup %}
+          <div class="card-actions">
+            <a href="{% url 'wireless:wirelesslangroup_add' %}?parent={{ object.pk }}" class="btn btn-ghost-primary btn-sm">
+              <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Add Wireless LAN Group" %}
+            </a>
+          </div>
+        {% endif %}
+      </h5>
       {% htmx_table 'wireless:wirelesslangroup_list' parent_id=object.pk %}
       {% htmx_table 'wireless:wirelesslangroup_list' parent_id=object.pk %}
-      {% if perms.wireless.add_wirelesslangroup %}
-        <div class="card-footer text-end d-print-none">
-          <a href="{% url 'wireless:wirelesslangroup_add' %}?parent={{ object.pk }}" class="btn btn-primary">
-            <span class="mdi mdi-plus-thick" aria-hidden="true"></span> {% trans "Add Wireless LAN Group" %}
-          </a>
-        </div>
-      {% endif %}
     </div>
     </div>
     {% plugin_full_width_page object %}
     {% plugin_full_width_page object %}
   </div>
   </div>