Răsfoiți Sursa

General UI cleanup

jeremystretch 4 ani în urmă
părinte
comite
19eafef41e

+ 2 - 2
netbox/netbox/navigation_menu.py

@@ -304,8 +304,8 @@ OTHER_MENU = Menu(
         MenuGroup(
             label="Miscellaneous",
             items=(
-                MenuItem(label="Config Contexts",
-                         url="extras:configcontext_list", add_url=None, import_url=None),
+                MenuItem(label="Config Contexts", url="extras:configcontext_list",
+                         add_url="extras:configcontext_add", import_url=None),
                 MenuItem(label="Reports", url="extras:report_list",
                          add_url=None, import_url=None),
                 MenuItem(label="Scripts", url="extras:script_list",

Fișier diff suprimat deoarece este prea mare
+ 0 - 0
netbox/project-static/dist/netbox-dark.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
netbox/project-static/dist/netbox-dark.css.map


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
netbox/project-static/dist/netbox-light.css


Fișier diff suprimat deoarece este prea mare
+ 0 - 0
netbox/project-static/dist/netbox-light.css.map


+ 8 - 2
netbox/project-static/styles/netbox.scss

@@ -3,7 +3,7 @@
 @use 'sass:map';
 
 :root {
-  --nbx-sidebar-bg: #{$gray-100};
+  --nbx-sidebar-bg: #{$gray-200};
   --nbx-sidebar-link-color: #{$gray-800};
   --nbx-sidebar-link-hover-bg: #{$blue-100};
   --nbx-sidebar-title-color: #{$text-muted};
@@ -23,7 +23,7 @@
   --nbx-color-mode-toggle-color: #{$primary};
 
   body[data-netbox-color-mode='dark'] {
-    --nbx-sidebar-bg: #{$gray-900};
+    --nbx-sidebar-bg: #{$gray-800};
     --nbx-sidebar-link-color: #{$gray-200};
     --nbx-sidebar-link-hover-bg: #{rgba($blue-300, 0.15)};
     --nbx-sidebar-title-color: #{$gray-600};
@@ -300,6 +300,11 @@ body {
         vertical-align: bottom;
       }
     }
+    &.attr-table {
+      th {
+        width: 25%;
+      }
+    }
   }
 }
 
@@ -605,6 +610,7 @@ span.color-label {
   height: 1rem;
   display: block;
   box-shadow: $box-shadow-sm;
+  border: 1px solid #303030;
   border-radius: $border-radius;
   padding: $badge-padding-y $badge-padding-x;
 }

+ 6 - 6
netbox/templates/circuits/circuit.html

@@ -30,6 +30,12 @@
                         <th scope="row">Type</th>
                         <td><a href="{{ object.type.get_absolute_url }}">{{ object.type }}</a></td>
                     </tr>
+                    <tr>
+                        <th scope="row">Status</th>
+                        <td>
+                            <span class="badge bg-{{ object.get_status_class }}">{{ object.get_status_display }}</span>
+                        </td>
+                    </tr>
                     <tr>
                         <th scope="row">Tenant</th>
                         <td>
@@ -43,12 +49,6 @@
                             {% endif %}
                         </td>
                     </tr>
-                    <tr>
-                        <th scope="row">Status</th>
-                        <td>
-                            <span class="badge bg-{{ object.get_status_class }}">{{ object.get_status_display }}</span>
-                        </td>
-                    </tr>
                     <tr>
                         <th scope="row">Install Date</th>
                         <td>{{ object.install_date|annotated_date|placeholder }}</td>

+ 1 - 1
netbox/templates/dcim/consoleport.html

@@ -19,7 +19,7 @@
                         </tr>
                         <tr>
                             <th scope="row">Name</th>
-                            <th scope="row">{{ object.name }}</th>
+                            <td>{{ object.name }}</td>
                         </tr>
                         <tr>
                             <th scope="row">Label</th>

+ 329 - 337
netbox/templates/dcim/device.html

@@ -6,358 +6,350 @@
 {% load plugins %}
 
 {% block content %}
-<div class="row">
-    <div class="col col-md-12">
-        <div class="tab-content">
-            <div role="tabpanel" class="tab-pane active" id="details">
-                <div class="row">
-                    <div class="col col-md-6">
-                        <div class="card">
-                            <h5 class="card-header">
-                                Device
-                            </h5>
-                            <div class="card-body">
-                                <table class="table table-hover attr-table">
-                                    <tr>
-                                        <th scope="row">Region</th>
-                                        <td>
-                                            {% if object.site.region %}
-                                                {% for region in object.site.region.get_ancestors %}
-                                                <a href="{{ region.get_absolute_url }}">{{ region }}</a> /
-                                                {% endfor %}
-                                                <a href="{{ object.site.region.get_absolute_url }}">{{ object.site.region }}</a>
-                                            {% else %}
-                                            <span class="text-muted">None</span>
-                                            {% endif %}
-                                        </td>
-                                    </tr>
-                                    <tr>
-                                        <th scope="row">Site</th>
-                                        <td>
-                                            <a href="{{ object.site.get_absolute_url }}">{{ object.site }}</a>
-                                        </td>
-                                    </tr>
-                                    <th scope="row">Location</th>
-                                        <td>
-                                        {% if object.location %}
-                                            {% for location in object.location.get_ancestors %}
-                                                <a href="{{ location.get_absolute_url }}">{{ location }}</a> /
-                                            {% endfor %}
-                                            <a href="{{ object.location.get_absolute_url }}">{{ object.location }}</a>
-                                        {% else %}
-                                            <span class="text-muted">None</span>
+    <div class="row">
+        <div class="col col-md-6">
+            <div class="card">
+                <h5 class="card-header">
+                    Device
+                </h5>
+                <div class="card-body">
+                    <table class="table table-hover attr-table">
+                        <tr>
+                            <th scope="row">Region</th>
+                            <td>
+                                {% if object.site.region %}
+                                    {% for region in object.site.region.get_ancestors %}
+                                    <a href="{{ region.get_absolute_url }}">{{ region }}</a> /
+                                    {% endfor %}
+                                    <a href="{{ object.site.region.get_absolute_url }}">{{ object.site.region }}</a>
+                                {% else %}
+                                <span class="text-muted">None</span>
+                                {% endif %}
+                            </td>
+                        </tr>
+                        <tr>
+                            <th scope="row">Site</th>
+                            <td>
+                                <a href="{{ object.site.get_absolute_url }}">{{ object.site }}</a>
+                            </td>
+                        </tr>
+                        <th scope="row">Location</th>
+                            <td>
+                            {% if object.location %}
+                                {% for location in object.location.get_ancestors %}
+                                    <a href="{{ location.get_absolute_url }}">{{ location }}</a> /
+                                {% endfor %}
+                                <a href="{{ object.location.get_absolute_url }}">{{ object.location }}</a>
+                            {% else %}
+                                <span class="text-muted">None</span>
+                            {% endif %}
+                            </td>
+                        </tr>
+                        <tr>
+                            <th scope="row">Rack</th>
+                            <td>
+                                {% if object.rack %}
+                                    <a href="{% url 'dcim:rack' pk=object.rack.pk %}">{{ object.rack }}</a>
+                                {% else %}
+                                    <span class="text-muted">None</span>
+                                {% endif %}
+                            </td>
+                        </tr>
+                        <tr>
+                            <th scope="row">Position</th>
+                            <td>
+                                {% if object.parent_bay %}
+                                    {% with object.parent_bay.device as parent %}
+                                        <a href="{{ parent.get_absolute_url }}">{{ parent }}</a> / {{ object.parent_bay }}
+                                        {% if parent.position %}
+                                            (U{{ parent.position }} / {{ parent.get_face_display }})
                                         {% endif %}
-                                        </td>
-                                    </tr>
-                                    <tr>
-                                        <th scope="row">Rack</th>
-                                        <td>
-                                            {% if object.rack %}
-                                                <a href="{% url 'dcim:rack' pk=object.rack.pk %}">{{ object.rack }}</a>
-                                            {% else %}
-                                                <span class="text-muted">None</span>
-                                            {% endif %}
-                                        </td>
-                                    </tr>
-                                    <tr>
-                                        <th scope="row">Position</th>
-                                        <td>
-                                            {% if object.parent_bay %}
-                                                {% with object.parent_bay.device as parent %}
-                                                    <a href="{{ parent.get_absolute_url }}">{{ parent }}</a> / {{ object.parent_bay }}
-                                                    {% if parent.position %}
-                                                        (U{{ parent.position }} / {{ parent.get_face_display }})
-                                                    {% endif %}
-                                                {% endwith %}
-                                            {% elif object.rack and object.position %}
-                                                <span>U{{ object.position }} / {{ object.get_face_display }}</span>
-                                            {% elif object.rack and object.device_type.u_height %}
-                                                <span class="badge bg-warning">Not racked</span>
-                                            {% else %}
-                                                <span class="text-muted">&mdash;</span>
-                                            {% endif %}
-                                        </td>
-                                    </tr>
-                                    <tr>
-                                        <th scope="row">Tenant</th>
-                                        <td>
-                                            {% if object.tenant %}
-                                                {% if object.tenant.group %}
-                                                    <a href="{{ object.tenant.group.get_absolute_url }}">{{ object.tenant.group }}</a> /
-                                                {% endif %}
-                                                <a href="{{ object.tenant.get_absolute_url }}">{{ object.tenant }}</a>
-                                            {% else %}
-                                                <span class="text-muted">None</span>
-                                            {% endif %}
-                                        </td>
-                                    </tr>
-                                    <tr>
-                                        <th scope="row">Device Type</th>
-                                        <td>
-                                            <span><a href="{{ object.device_type.get_absolute_url }}">{{ object.device_type }}</a> ({{ object.device_type.u_height }}U)</span>
-                                        </td>
-                                    </tr>
-                                    <tr>
-                                        <th scope="row">Serial Number</th>
-                                        <td><code>{{ object.serial|placeholder }}</code></td>
-                                    </tr>
-                                    <tr>
-                                        <th scope="row">Asset Tag</th>
-                                        <td><span>{{ object.asset_tag|placeholder }}</span></td>
-                                    </tr>
-                                </table>
-                            </div>
-                        </div>
-                        {% if vc_members %}
-                            <div class="card">
-                                <h5 class="card-header">
-                                    Virtual Chassis
-                                </h5>
-                                <div class="card-body">
-                                    <table class="table table-hover attr-table">
-                                        <tr>
-                                            <th>Device</th>
-                                            <th>Position</th>
-                                            <th>Master</th>
-                                            <th>Priority</th>
-                                        </tr>
-                                        {% for vc_member in vc_members %}
-                                            <tr{% if vc_member == object %} class="info"{% endif %}>
-                                                <td>
-                                                    <a href="{{ vc_member.get_absolute_url }}">{{ vc_member }}</a>
-                                                </td>
-                                                <td><span class="badge badge-default">{{ vc_member.vc_position }}</span></td>
-                                                <td>{% if object.virtual_chassis.master == vc_member %}<i class="mdi mdi-check-bold"></i>{% endif %}</td>
-                                                <td>{{ vc_member.vc_priority|default:"" }}</td>
-                                            </tr>
-                                        {% endfor %}
-                                    </table>
-                                </div>
-                                <div class="card-footer text-end noprint">
-                                    <a href="{{ object.virtual_chassis.get_absolute_url }}" class="btn btn-primary btn-sm">
-                                        <span class="mdi mdi-arrow-right-bold" aria-hidden="true"></span> View Virtual Chassis
-                                    </a>
-                                </div>
-                            </div>
-                        {% endif %}
-                        <div class="card">
-                            <h5 class="card-header">
-                                Management
-                            </h5>
-                            <div class="card-body">
-                                <table class="table table-hover attr-table">
-                                    <tr>
-                                        <th scope="row">Status</th>
-                                        <td>
-                                            <span class="badge bg-{{ object.get_status_class }}">{{ object.get_status_display }}</span>
-                                        </td>
-                                    </tr>
-                                    <tr>
-                                        <th scope="row">Role</th>
-                                        <td>
-                                            <a href="{% url 'dcim:device_list' %}?role={{ object.device_role.slug }}">{{ object.device_role }}</a>
-                                        </td>
-                                    </tr>
-                                    <tr>
-                                        <th scope="row">Platform</th>
-                                        <td>
-                                            {% if object.platform %}
-                                            <a href="{{ object.platform.get_absolute_url }}">{{ object.platform }}</a>
-                                            {% else %}
-                                                <span class="text-muted">None</span>
-                                            {% endif %}
-                                        </td>
-                                    </tr>
-                                    <tr>
-                                        <th scope="row">Primary IPv4</th>
-                                        <td>
-                                            {% if object.primary_ip4 %}
-                                                <a href="{% url 'ipam:ipaddress' pk=object.primary_ip4.pk %}">{{ object.primary_ip4.address.ip }}</a>
-                                                {% if object.primary_ip4.nat_inside %}
-                                                    <span>(NAT for {{ object.primary_ip4.nat_inside.address.ip }})</span>
-                                                {% elif object.primary_ip4.nat_outside %}
-                                                    <span>(NAT: {{ object.primary_ip4.nat_outside.address.ip }})</span>
-                                                {% endif %}
-                                            {% else %}
-                                                <span class="text-muted">&mdash;</span>
-                                            {% endif %}
-                                        </td>
-                                    </tr>
-                                    <tr>
-                                        <th scope="row">Primary IPv6</th>
-                                        <td>
-                                            {% if object.primary_ip6 %}
-                                                <a href="{% url 'ipam:ipaddress' pk=object.primary_ip6.pk %}">{{ object.primary_ip6.address.ip }}</a>
-                                                {% if object.primary_ip6.nat_inside %}
-                                                    <span>(NAT for {{ object.primary_ip6.nat_inside.address.ip }})</span>
-                                                {% elif object.primary_ip6.nat_outside %}
-                                                    <span>(NAT: {{ object.primary_ip6.nat_outside.address.ip }})</span>
-                                                {% endif %}
-                                            {% else %}
-                                                <span class="text-muted">&mdash;</span>
-                                            {% endif %}
-                                        </td>
-                                    </tr>
-                                    {% if object.cluster %}
-                                        <tr>
-                                            <th>Cluster</th>
-                                            <td>
-                                                {% if object.cluster.group %}
-                                                    <a href="{{ object.cluster.group.get_absolute_url }}">{{ object.cluster.group }}</a> /
-                                                {% endif %}
-                                                <a href="{{ object.cluster.get_absolute_url }}">{{ object.cluster }}</a>
-                                            </td>
-                                        </tr>
+                                    {% endwith %}
+                                {% elif object.rack and object.position %}
+                                    <span>U{{ object.position }} / {{ object.get_face_display }}</span>
+                                {% elif object.rack and object.device_type.u_height %}
+                                    <span class="badge bg-warning">Not racked</span>
+                                {% else %}
+                                    <span class="text-muted">&mdash;</span>
+                                {% endif %}
+                            </td>
+                        </tr>
+                        <tr>
+                            <th scope="row">Tenant</th>
+                            <td>
+                                {% if object.tenant %}
+                                    {% if object.tenant.group %}
+                                        <a href="{{ object.tenant.group.get_absolute_url }}">{{ object.tenant.group }}</a> /
                                     {% endif %}
-                                </table>
-                            </div>
-                        </div>
-                        {% include 'inc/custom_fields_panel.html' %}
-                        {% include 'extras/inc/tags_panel.html' with tags=object.tags.all url='dcim:device_list' %}
-                        <div class="card">
-                            <h5 class="card-header">
-                                Comments
-                            </h5>
-                            <div class="card-body rendered-markdown">
-                                {% if object.comments %}
-                                    {{ object.comments|render_markdown }}
+                                    <a href="{{ object.tenant.get_absolute_url }}">{{ object.tenant }}</a>
                                 {% else %}
                                     <span class="text-muted">None</span>
                                 {% endif %}
-                            </div>
-                        </div>
-                        {% plugin_left_page object %}
+                            </td>
+                        </tr>
+                        <tr>
+                            <th scope="row">Device Type</th>
+                            <td>
+                                <span><a href="{{ object.device_type.get_absolute_url }}">{{ object.device_type }}</a> ({{ object.device_type.u_height }}U)</span>
+                            </td>
+                        </tr>
+                        <tr>
+                            <th scope="row">Serial Number</th>
+                            <td><code>{{ object.serial|placeholder }}</code></td>
+                        </tr>
+                        <tr>
+                            <th scope="row">Asset Tag</th>
+                            <td><span>{{ object.asset_tag|placeholder }}</span></td>
+                        </tr>
+                    </table>
+                </div>
+            </div>
+            {% if vc_members %}
+                <div class="card">
+                    <h5 class="card-header">
+                        Virtual Chassis
+                    </h5>
+                    <div class="card-body">
+                        <table class="table table-hover attr-table">
+                            <tr>
+                                <th>Device</th>
+                                <th>Position</th>
+                                <th>Master</th>
+                                <th>Priority</th>
+                            </tr>
+                            {% for vc_member in vc_members %}
+                                <tr{% if vc_member == object %} class="info"{% endif %}>
+                                    <td>
+                                        <a href="{{ vc_member.get_absolute_url }}">{{ vc_member }}</a>
+                                    </td>
+                                    <td><span class="badge badge-default">{{ vc_member.vc_position }}</span></td>
+                                    <td>{% if object.virtual_chassis.master == vc_member %}<i class="mdi mdi-check-bold"></i>{% endif %}</td>
+                                    <td>{{ vc_member.vc_priority|default:"" }}</td>
+                                </tr>
+                            {% endfor %}
+                        </table>
                     </div>
-                    <div class="col col-md-6">
-                        {% if object.powerports.exists and object.poweroutlets.exists %}
-                            <div class="card">
-                                <h5 class="card-header">
-                                    Power Utilization
-                                </h5>
-                                <div class="card-body">
-                                    <table class="table table-hover">
-                                        <tr>
-                                            <th>Input</th>
-                                            <th>Outlets</th>
-                                            <th>Allocated</th>
-                                            <th>Available</th>
-                                            <th>Utilization</th>
-                                        </tr>
-                                        {% for powerport in object.powerports.all %}
-                                            {% with utilization=powerport.get_power_draw powerfeed=powerport.connected_endpoint %}
-                                                <tr>
-                                                    <td>{{ powerport }}</td>
-                                                    <td>{{ utilization.outlet_count }}</td>
-                                                    <td>{{ utilization.allocated }}VA</td>
-                                                    {% if powerfeed.available_power %}
-                                                        <td>{{ powerfeed.available_power }}VA</td>
-                                                        <td>{% utilization_graph utilization.allocated|percentage:powerfeed.available_power %}</td>
-                                                    {% else %}
-                                                        <td class="text-muted">&mdash;</td>
-                                                        <td class="text-muted">&mdash;</td>
-                                                    {% endif %}
-                                                </tr>
-                                                {% for leg in utilization.legs %}
-                                                    <tr>
-                                                        <td style="padding-left: 20px">Leg {{ leg.name }}</td>
-                                                        <td>{{ leg.outlet_count }}</td>
-                                                        <td>{{ leg.allocated }}</td>
-                                                        <td>{{ powerfeed.available_power|divide:3 }}VA</td>
-                                                        {% with phase_available=powerfeed.available_power|divide:3 %}
-                                                            <td>{% utilization_graph leg.allocated|percentage:phase_available %}</td>
-                                                        {% endwith %}
-                                                    </tr>
-                                                {% endfor %}
-                                            {% endwith %}
-                                        {% endfor %}
-                                    </table>
-                                </div>
-                            </div>
+                    <div class="card-footer text-end noprint">
+                        <a href="{{ object.virtual_chassis.get_absolute_url }}" class="btn btn-primary btn-sm">
+                            <span class="mdi mdi-arrow-right-bold" aria-hidden="true"></span> View Virtual Chassis
+                        </a>
+                    </div>
+                </div>
+            {% endif %}
+            <div class="card">
+                <h5 class="card-header">
+                    Management
+                </h5>
+                <div class="card-body">
+                    <table class="table table-hover attr-table">
+                        <tr>
+                            <th scope="row">Status</th>
+                            <td>
+                                <span class="badge bg-{{ object.get_status_class }}">{{ object.get_status_display }}</span>
+                            </td>
+                        </tr>
+                        <tr>
+                            <th scope="row">Role</th>
+                            <td>
+                                <a href="{% url 'dcim:device_list' %}?role={{ object.device_role.slug }}">{{ object.device_role }}</a>
+                            </td>
+                        </tr>
+                        <tr>
+                            <th scope="row">Platform</th>
+                            <td>
+                                {% if object.platform %}
+                                <a href="{{ object.platform.get_absolute_url }}">{{ object.platform }}</a>
+                                {% else %}
+                                    <span class="text-muted">None</span>
+                                {% endif %}
+                            </td>
+                        </tr>
+                        <tr>
+                            <th scope="row">Primary IPv4</th>
+                            <td>
+                                {% if object.primary_ip4 %}
+                                    <a href="{% url 'ipam:ipaddress' pk=object.primary_ip4.pk %}">{{ object.primary_ip4.address.ip }}</a>
+                                    {% if object.primary_ip4.nat_inside %}
+                                        <span>(NAT for {{ object.primary_ip4.nat_inside.address.ip }})</span>
+                                    {% elif object.primary_ip4.nat_outside %}
+                                        <span>(NAT: {{ object.primary_ip4.nat_outside.address.ip }})</span>
+                                    {% endif %}
+                                {% else %}
+                                    <span class="text-muted">&mdash;</span>
+                                {% endif %}
+                            </td>
+                        </tr>
+                        <tr>
+                            <th scope="row">Primary IPv6</th>
+                            <td>
+                                {% if object.primary_ip6 %}
+                                    <a href="{% url 'ipam:ipaddress' pk=object.primary_ip6.pk %}">{{ object.primary_ip6.address.ip }}</a>
+                                    {% if object.primary_ip6.nat_inside %}
+                                        <span>(NAT for {{ object.primary_ip6.nat_inside.address.ip }})</span>
+                                    {% elif object.primary_ip6.nat_outside %}
+                                        <span>(NAT: {{ object.primary_ip6.nat_outside.address.ip }})</span>
+                                    {% endif %}
+                                {% else %}
+                                    <span class="text-muted">&mdash;</span>
+                                {% endif %}
+                            </td>
+                        </tr>
+                        {% if object.cluster %}
+                            <tr>
+                                <th>Cluster</th>
+                                <td>
+                                    {% if object.cluster.group %}
+                                        <a href="{{ object.cluster.group.get_absolute_url }}">{{ object.cluster.group }}</a> /
+                                    {% endif %}
+                                    <a href="{{ object.cluster.get_absolute_url }}">{{ object.cluster }}</a>
+                                </td>
+                            </tr>
                         {% endif %}
-                        <div class="card">
-                            <h5 class="card-header">
-                                Services
-                            </h5>
-                            <div class="card-body">
-                            {% if services %}
-                                <table class="table table-hover">
-                                    {% for service in services %}
-                                        {% include 'ipam/inc/service.html' %}
-                                    {% endfor %}
-                                </table>
-                            {% else %}
-                                <div class="text-muted">
-                                    None
-                                </div>
-                            {% endif %}
-                            </div>
-                            {% if perms.ipam.add_service %}
-                            <div class="card-footer text-end noprint">
-                                <a href="{% url 'dcim:device_service_assign' device=object.pk %}" class="btn btn-sm btn-primary">
-                                    <span class="mdi mdi-plus-thick" aria-hidden="true"></span> Assign Service
-                                </a>
-                            </div>
-                            {% endif %}
-                        </div>
-                        <div class="card">
-                            <h5 class="card-header">
-                                Images
-                            </h5>
-                            <div class="card-body">
-                                {% include 'inc/image_attachments.html' with images=object.images.all %}
-                            </div>
-                            {% if perms.extras.add_imageattachment %}
-                            <div class="card-footer text-end noprint">
-                                <a href="{% url 'dcim:device_add_image' object_id=object.pk %}" class="btn btn-primary btn-sm">
-                                    <span class="mdi mdi-plus-thick" aria-hidden="true"></span>
-                                    Attach an Image
-                                </a>
-                            </div>
-                            {% endif %}
-                        </div>
-                        <div class="card noprint">
-                            <h5 class="card-header">
-                                Related Devices
-                            </h5>
-                            <div class="card-body">
-                                {% if related_devices %}
-                                <table class="table table-hover">
-                                    <tr>
-                                        <th>Device</th>
-                                        <th>Rack</th>
-                                        <th>Type</th>
-                                    </tr>
-                                    {% for rd in related_devices %}
+                    </table>
+                </div>
+            </div>
+            {% include 'inc/custom_fields_panel.html' %}
+            {% include 'extras/inc/tags_panel.html' with tags=object.tags.all url='dcim:device_list' %}
+            <div class="card">
+                <h5 class="card-header">
+                    Comments
+                </h5>
+                <div class="card-body rendered-markdown">
+                    {% if object.comments %}
+                        {{ object.comments|render_markdown }}
+                    {% else %}
+                        <span class="text-muted">None</span>
+                    {% endif %}
+                </div>
+            </div>
+            {% plugin_left_page object %}
+        </div>
+        <div class="col col-md-6">
+            {% if object.powerports.exists and object.poweroutlets.exists %}
+                <div class="card">
+                    <h5 class="card-header">
+                        Power Utilization
+                    </h5>
+                    <div class="card-body">
+                        <table class="table table-hover">
+                            <tr>
+                                <th>Input</th>
+                                <th>Outlets</th>
+                                <th>Allocated</th>
+                                <th>Available</th>
+                                <th>Utilization</th>
+                            </tr>
+                            {% for powerport in object.powerports.all %}
+                                {% with utilization=powerport.get_power_draw powerfeed=powerport.connected_endpoint %}
                                     <tr>
-                                        <td>
-                                            <a href="{% url 'dcim:device' pk=rd.pk %}">{{ rd }}</a>
-                                        </td>
-                                        <td>
-                                            {% if rd.rack %}
-                                                <a href="{% url 'dcim:rack' pk=rd.rack.pk %}">{{ rd.rack }}</a>
-                                            {% else %}
-                                                <span class="text-muted">&mdash;</span>
-                                            {% endif %}
-                                        </td>
-                                        <td>{{ rd.device_type }}</td>
+                                        <td>{{ powerport }}</td>
+                                        <td>{{ utilization.outlet_count }}</td>
+                                        <td>{{ utilization.allocated }}VA</td>
+                                        {% if powerfeed.available_power %}
+                                            <td>{{ powerfeed.available_power }}VA</td>
+                                            <td>{% utilization_graph utilization.allocated|percentage:powerfeed.available_power %}</td>
+                                        {% else %}
+                                            <td class="text-muted">&mdash;</td>
+                                            <td class="text-muted">&mdash;</td>
+                                        {% endif %}
                                     </tr>
+                                    {% for leg in utilization.legs %}
+                                        <tr>
+                                            <td style="padding-left: 20px">Leg {{ leg.name }}</td>
+                                            <td>{{ leg.outlet_count }}</td>
+                                            <td>{{ leg.allocated }}</td>
+                                            <td>{{ powerfeed.available_power|divide:3 }}VA</td>
+                                            {% with phase_available=powerfeed.available_power|divide:3 %}
+                                                <td>{% utilization_graph leg.allocated|percentage:phase_available %}</td>
+                                            {% endwith %}
+                                        </tr>
                                     {% endfor %}
-                                </table>
-                                {% else %}
-                                <div class="text-muted">None</div>
-                                {% endif %}
-                            </div>
-                        </div>
-                        {% plugin_right_page object %}
+                                {% endwith %}
+                            {% endfor %}
+                        </table>
                     </div>
                 </div>
-                <div class="row">
-                    <div class="col col-md-12">
-                        {% plugin_full_width_page object %}
+            {% endif %}
+            <div class="card">
+                <h5 class="card-header">
+                    Services
+                </h5>
+                <div class="card-body">
+                {% if services %}
+                    <table class="table table-hover">
+                        {% for service in services %}
+                            {% include 'ipam/inc/service.html' %}
+                        {% endfor %}
+                    </table>
+                {% else %}
+                    <div class="text-muted">
+                        None
                     </div>
+                {% endif %}
+                </div>
+                {% if perms.ipam.add_service %}
+                <div class="card-footer text-end noprint">
+                    <a href="{% url 'dcim:device_service_assign' device=object.pk %}" class="btn btn-sm btn-primary">
+                        <span class="mdi mdi-plus-thick" aria-hidden="true"></span> Assign Service
+                    </a>
+                </div>
+                {% endif %}
+            </div>
+            <div class="card">
+                <h5 class="card-header">
+                    Images
+                </h5>
+                <div class="card-body">
+                    {% include 'inc/image_attachments.html' with images=object.images.all %}
+                </div>
+                {% if perms.extras.add_imageattachment %}
+                <div class="card-footer text-end noprint">
+                    <a href="{% url 'dcim:device_add_image' object_id=object.pk %}" class="btn btn-primary btn-sm">
+                        <span class="mdi mdi-plus-thick" aria-hidden="true"></span>
+                        Attach an Image
+                    </a>
                 </div>
+                {% endif %}
             </div>
+            <div class="card noprint">
+                <h5 class="card-header">
+                    Related Devices
+                </h5>
+                <div class="card-body">
+                    {% if related_devices %}
+                    <table class="table table-hover">
+                        <tr>
+                            <th>Device</th>
+                            <th>Rack</th>
+                            <th>Type</th>
+                        </tr>
+                        {% for rd in related_devices %}
+                        <tr>
+                            <td>
+                                <a href="{% url 'dcim:device' pk=rd.pk %}">{{ rd }}</a>
+                            </td>
+                            <td>
+                                {% if rd.rack %}
+                                    <a href="{% url 'dcim:rack' pk=rd.rack.pk %}">{{ rd.rack }}</a>
+                                {% else %}
+                                    <span class="text-muted">&mdash;</span>
+                                {% endif %}
+                            </td>
+                            <td>{{ rd.device_type }}</td>
+                        </tr>
+                        {% endfor %}
+                    </table>
+                    {% else %}
+                    <div class="text-muted">None</div>
+                    {% endif %}
+                </div>
+            </div>
+            {% plugin_right_page object %}
+        </div>
+    </div>
+    <div class="row">
+        <div class="col col-md-12">
+            {% plugin_full_width_page object %}
         </div>
     </div>
-</div>
 {% endblock %}

+ 31 - 19
netbox/templates/dcim/interface.html

@@ -21,24 +21,6 @@
                 </h5>
                 <div class="card-body">
                     <table class="table table-hover">
-                        <tr>
-                            <td colspan="2">
-                                {% if object.enabled %}
-                                    <span class="badge bg-success">Enabled</span>
-                                {% else %}
-                                    <span class="badge bg-danger">Disabled</span>
-                                {% endif %}
-                            </td>
-                        </tr>
-                        <tr>
-                            <td colspan="2">
-                                {% if object.mgmt_only %}
-                                    <span class="badge bg-success">Management Only</span>
-                                {% else %}
-                                    <span class="badge bg-danger">Not Management Only</span>
-                                {% endif %}
-                            </td>
-                        </tr>
                         <tr>
                             <th scope="row">Device</th>
                             <td>
@@ -57,6 +39,36 @@
                             <th scope="row">Type</th>
                             <td>{{ object.get_type_display }}</td>
                         </tr>
+                        <tr>
+                            <th scope="row">Enabled</th>
+                            <td>
+                                {% if object.enabled %}
+                                    <i class="mdi mdi-check-bold text-success" title="Yes"></i>
+                                {% else %}
+                                    <i class="mdi mdi-close-thick text-danger" title="No"></i>
+                                {% endif %}
+                            </td>
+                        </tr>
+                        <tr>
+                            <th scope="row">Management Only</th>
+                            <td>
+                                {% if object.mgmt_only %}
+                                    <i class="mdi mdi-check-bold text-success" title="Yes"></i>
+                                {% else %}
+                                    <i class="mdi mdi-close-thick text-danger" title="No"></i>
+                                {% endif %}
+                            </td>
+                        </tr>
+                        <tr>
+                            <th scope="row">Parent</th>
+                            <td>
+                                {% if object.parent %}
+                                    <a href="{{ object.parent.get_absolute_url }}">{{ object.parent }}</a>
+                                {% else %}
+                                    <span class="text-muted">None</span>
+                                {% endif %}
+                            </td>
+                        </tr>
                         <tr>
                             <th scope="row">LAG</th>
                             <td>
@@ -81,7 +93,7 @@
                         </tr>
                         <tr>
                             <th scope="row">802.1Q Mode</th>
-                            <td>{{ object.get_mode_display }}</td>
+                            <td>{{ object.get_mode_display|placeholder }}</td>
                         </tr>
                     </table>
                 </div>

+ 1 - 1
netbox/templates/dcim/poweroutlet.html

@@ -39,7 +39,7 @@
                         </tr>
                         <tr>
                             <th scope="row">Feed Leg</th>
-                            <td>{{ object.get_feed_leg_display }}</td>
+                            <td>{{ object.get_feed_leg_display|placeholder }}</td>
                         </tr>
                     </table>
                 </div>

+ 1 - 1
netbox/templates/dcim/powerport.html

@@ -27,7 +27,7 @@
                         </tr>
                         <tr>
                             <th scope="row">Type</th>
-                            <td>{{ object.get_type_display }}</td>
+                            <td>{{ object.get_type_display|placeholder }}</td>
                         </tr>
                         <tr>
                             <th scope="row">Description</th>

+ 17 - 30
netbox/templates/dcim/rack.html

@@ -31,8 +31,8 @@
 {% endblock %}
 
 {% block content %}
-<div class="row">
-	<div class="col col-12 col-xl-6">
+  <div class="row">
+	  <div class="col col-12 col-xl-5">
         <div class="card">
             <h5 class="card-header">
                 Rack
@@ -47,28 +47,15 @@
                             {% endif %}
                             <a href="{{ object.site.get_absolute_url }}">{{ object.site }}</a>
                         </td>
-                </tr>
-                <tr>
-                    <th scope="row">Location</th>
-                    <td>
-                        {% if object.location %}
-                            {% for location in object.location.get_ancestors %}
-                                <a href="{{ location.get_absolute_url }}">{{ location }}</a> /
-                            {% endfor %}
-                            <a href="{{ object.location.get_absolute_url }}">{{ object.location }}</a>
-                        {% else %}
-                            <span class="text-muted">None</span>
-                        {% endif %}
-                    </td>
-                </tr>
+                    </tr>
                     <tr>
-                        <th scope="row">Group</th>
+                        <th scope="row">Location</th>
                         <td>
-                            {% if object.group %}
-                                {% for group in object.group.get_ancestors %}
-                                    <a href="{{ group.get_absolute_url }}">{{ group }}</a> /
+                            {% if object.location %}
+                                {% for location in object.location.get_ancestors %}
+                                    <a href="{{ location.get_absolute_url }}">{{ location }}</a> /
                                 {% endfor %}
-                                <a href="{{ object.group.get_absolute_url }}">{{ object.group }}</a>
+                                <a href="{{ object.location.get_absolute_url }}">{{ object.location }}</a>
                             {% else %}
                                 <span class="text-muted">None</span>
                             {% endif %}
@@ -109,7 +96,7 @@
                     </tr>
                     <tr>
                         <th scope="row">Serial Number</th>
-                        <td><code>{{ object.serial|placeholder }}</code></td>
+                        <td>{{ object.serial|placeholder }}</td>
                     </tr>
                     <tr>
                         <th scope="row">Asset Tag</th>
@@ -308,8 +295,8 @@
             {% endif %}
         </div>
         {% plugin_left_page object %}
-	</div>
-    <div class="col col-12 col-xl-6">
+	  </div>
+    <div class="col col-12 col-xl-7">
         <div class="row" style="margin-bottom: 20px">
             <div class="col col-md-6 col-sm-6 col-xs-12 text-center">
               <div style="margin-left: 30px">
@@ -370,10 +357,10 @@
         </div>
         {% plugin_right_page object %}
     </div>
-</div>
-<div class="row">
-    <div class="col col-md-12">
-        {% plugin_full_width_page object %}
-    </div>
-</div>
+  </div>
+  <div class="row">
+      <div class="col col-md-12">
+          {% plugin_full_width_page object %}
+      </div>
+  </div>
 {% endblock %}

+ 5 - 5
netbox/templates/dcim/rackreservation.html

@@ -12,7 +12,7 @@
 
 {% block content %}
 <div class="row mb-3">
-	<div class="col col-md-6">
+	<div class="col col-12 col-xl-5">
         <div class="card">
             <h5 class="card-header">
                 Rack
@@ -30,10 +30,10 @@
                             </td>
                         </tr>
                         <tr>
-                            <th scope="row">Group</th>
+                            <th scope="row">Location</th>
                             <td>
-                                {% if rack.group %}
-                                    <a href="{{ rack.group.get_absolute_url }}">{{ rack.group }}</a>
+                                {% if rack.location %}
+                                    <a href="{{ rack.location.get_absolute_url }}">{{ rack.location }}</a>
                                 {% else %}
                                     <span class="text-muted">None</span>
                                 {% endif %}
@@ -87,7 +87,7 @@
         {% include 'extras/inc/tags_panel.html' with tags=object.tags.all url='dcim:rackreservation_list' %}
         {% plugin_left_page object %}
 	</div>
-    <div class="col col-md-6">
+    <div class="col col-12 col-xl-7">
         <div class="row" style="margin-bottom: 20px">
             <div class="col col-md-6 col-sm-6 col-xs-12 text-center">
                 <div style="margin-left: 30px">

+ 19 - 6
netbox/templates/dcim/site.html

@@ -27,12 +27,6 @@
             </h5>
             <div class="card-body">
                 <table class="table table-hover attr-table">
-                    <tr>
-                        <td colspan="2">
-                        <span class="badge bg-{{ object.get_status_class }}">{{ object.get_status_display }}</span>
-                        </td>
-
-                    </tr>
                     <tr>
                         <th scope="row">Region</th>
                         <td>
@@ -46,6 +40,25 @@
                             {% endif %}
                         </td>
                     </tr>
+                    <tr>
+                        <th scope="row">Group</th>
+                        <td>
+                            {% if object.group %}
+                                {% for group in object.group.get_ancestors %}
+                                    <a href="{{ group.get_absolute_url }}">{{ group }}</a> /
+                                {% endfor %}
+                                <a href="{{ object.group.get_absolute_url }}">{{ object.group }}</a>
+                            {% else %}
+                                <span class="text-muted">None</span>
+                            {% endif %}
+                        </td>
+                    </tr>
+                    <tr>
+                        <th scope="row">Status</th>
+                        <td>
+                          <span class="badge bg-{{ object.get_status_class }}">{{ object.get_status_display }}</span>
+                        </td>
+                    </tr>
                     <tr>
                         <th scope="row">Tenant</th>
                         <td>

+ 1 - 1
netbox/templates/dcim/virtualchassis.html

@@ -60,7 +60,7 @@
                             <td>
                                 <a href="{{ vc_member.get_absolute_url }}">{{ vc_member }}</a>
                             </td>
-                            <td><span class="badge badge-default">{{ vc_member.vc_position }}</span></td>
+                            <td><span class="badge bg-secondary">{{ vc_member.vc_position }}</span></td>
                             <td>{% if object.master == vc_member %}<i class="mdi mdi-check-bold text-success"></i>{% endif %}</td>
                             <td>{{ vc_member.vc_priority|placeholder }}</td>
                         </tr>

+ 2 - 2
netbox/templates/extras/customlink.html

@@ -4,7 +4,7 @@
 
 {% block content %}
 <div class="row mb-3">
-	<div class="col col-md-6">
+	<div class="col col-md-5">
     <div class="card">
       <h5 class="card-header">
         Custom Link
@@ -46,7 +46,7 @@
     </div>
     {% plugin_left_page object %}
 	</div>
-	<div class="col col-md-6">
+	<div class="col col-md-7">
     <div class="card">
       <h5 class="card-header">
         Link Text

+ 2 - 2
netbox/templates/extras/exporttemplate.html

@@ -9,7 +9,7 @@
 
 {% block content %}
 <div class="row mb-3">
-	<div class="col col-md-6">
+	<div class="col col-md-5">
     <div class="card">
       <h5 class="card-header">
         Export Template
@@ -51,7 +51,7 @@
     </div>
     {% plugin_left_page object %}
 	</div>
-	<div class="col col-md-6">
+	<div class="col col-md-7">
     <div class="card">
       <h5 class="card-header">
         Template

+ 64 - 44
netbox/templates/extras/tag.html

@@ -3,52 +3,72 @@
 {% load plugins %}
 
 {% block content %}
-<div class="row">
-  <div class="col col-md-6">
-    <div class="card">
-      <h5 class="card-header">
-        Tag
-      </h5>
-      <div class="card-body">
-        <table class="table table-hover panel-body attr-table">
-          <tr>
-            <th scope="row">Name</th>
-            <td>
-              {{ object.name }}
-            </td>
-          </tr>
-          <tr>
-            <th scope="row">Slug</th>
-            <td>
-                {{ object.slug }}
-            </td>
-          </tr>
-          <tr>
-            <th scope="row">Tagged Items</th>
-            <td>
-                {{ items_count }}
-            </td>
-          </tr>
-          <tr>
-            <th scope="row">Color</th>
-            <td>
-                <span class="color-label" style="background-color: #{{ object.color }}">&nbsp;</span>
-            </td>
-          </tr>
-          <tr>
-            <th scope="row">Description</th>
-            <td>
-                {{ object.description|placeholder }}
-            </td>
-          </tr>
-        </table>
+  <div class="row">
+    <div class="col col-md-6">
+      <div class="card">
+        <h5 class="card-header">
+          Tag
+        </h5>
+        <div class="card-body">
+          <table class="table table-hover panel-body attr-table">
+            <tr>
+              <th scope="row">Name</th>
+              <td>
+                {{ object.name }}
+              </td>
+            </tr>
+            <tr>
+              <th scope="row">Description</th>
+              <td>
+                  {{ object.description|placeholder }}
+              </td>
+            </tr>
+            <tr>
+              <th scope="row">Color</th>
+              <td>
+                  <span class="color-label" style="background-color: #{{ object.color }}">&nbsp;</span>
+              </td>
+            </tr>
+            <tr>
+              <th scope="row">Tagged Items</th>
+              <td>
+                  {{ taggeditem_table.rows|length }}
+              </td>
+            </tr>
+          </table>
+        </div>
       </div>
     </div>
+    <div class="col col-md-6">
+      <div class="card">
+        <h5 class="card-header">
+          Tagged Item Types
+        </h5>
+        <div class="card-body">
+          <table class="table table-hover panel-body attr-table">
+            {% for object_type in object_types %}
+              <tr>
+                <td>{{ object_type.content_type.name|bettertitle }}</td>
+                <td>
+                  {% with viewname=object_type.content_type.model_class|validated_viewname:"list" %}
+                    {% if viewname %}
+                      <a href="{% url viewname %}?tag={{ object.slug }}">{{ object_type.item_count }}</a>
+                    {% else %}
+                      {{ object_type.item_count }}
+                    {% endif %}
+                  {% endwith %}
+                </td>
+              </tr>
+            {% endfor %}
+          </table>
+        </div>
+      </div>
   </div>
-  <div class="col col-md-6">
-    {% include 'inc/panel_table.html' with table=items_table heading='Tagged Objects' %}
-    {% include 'inc/paginator.html' with paginator=items_table.paginator page=items_table.page %}
+  <div class="row">
+    <div class="col">
+      {% include 'inc/panel_table.html' with table=taggeditem_table heading='Tagged Objects' %}
+      {% include 'inc/paginator.html' with paginator=taggeditem_table.paginator page=items_table.page %}
+    </div>
   </div>
-</div>
-{% plugin_full_width_page object %}
+  {% plugin_full_width_page object %}
 {% endblock %}

+ 5 - 5
netbox/templates/ipam/ipaddress.html

@@ -116,11 +116,11 @@
         {% include 'inc/panel_table.html' with table=parent_prefixes_table heading='Parent Prefixes' %}
         {% if duplicate_ips_table.rows %}
             {# Custom version of panel_table.html #}
-            <div class="card bg-danger">
+            <div class="card border-danger">
                 <h5 class="card-header">
-                    Duplicate IP Addresses
+                  <span class="text-danger">Duplicate IP Addresses</span>
                     {% if more_duplicate_ips %}
-                    <div class="float-end">
+                      <div class="float-end">
                         <a type="button" class="btn btn-primary btn-sm"
                         {% if object.vrf %}
                         href="{% url 'ipam:ipaddress_list' %}?address={{ object.address.ip }}&vrf_id={{ object.vrf.pk }}"
@@ -128,7 +128,7 @@
                         href="{% url 'ipam:ipaddress_list' %}?address={{ object.address.ip }}&vrf_id=null"
                         {% endif %}
                         >Show all</a>
-                    </div>
+                      </div>
                     {% endif %}
                 </h5>
                 <div class="card-body">
@@ -137,7 +137,7 @@
             </div>
         {% endif %}
         <div class="my-3">
-        {% include 'utilities/obj_table.html' with table=related_ips_table heading='Related IP Addresses' %}
+        {% include 'inc/panel_table.html' with table=related_ips_table heading='Related IP Addresses' %}
         </div>
         {% plugin_right_page object %}
 	</div>

+ 16 - 20
netbox/templates/ipam/prefix.html

@@ -4,7 +4,7 @@
 
 {% block content %}
 <div class="row">
-    <div class="col col-md-5">
+    <div class="col col-md-6">
         <div class="card">
             <h5 class="card-header">
               Prefix
@@ -74,6 +74,12 @@
                         {% endif %}
                     </td>
                 </tr>
+                <tr>
+                    <th scope="row">Status</th>
+                    <td>
+                      <span class="badge bg-{{ object.get_status_class }}">{{ object.get_status_display }}</span>
+                    </td>
+                </tr>
                 <tr>
                     <th scope="row">Role</th>
                     <td>
@@ -85,10 +91,8 @@
                     </td>
                 </tr>
                 <tr>
-                    <th scope="row">Status</th>
-                    <td>
-                      <span class="label label-{{ object.get_status_class }}">{{ object.get_status_display }}</span>
-                    </td>
+                    <th scope="row">Description</th>
+                    <td>{{ object.description|placeholder }}</td>
                 </tr>
                 <tr>
                     <th scope="row">Is a pool</th>
@@ -100,10 +104,6 @@
                         {% endif %}
                     </td>
                 </tr>
-                <tr>
-                    <th scope="row">Description</th>
-                    <td>{{ object.description|placeholder }}</td>
-                </tr>
                 <tr>
                     <th scope="row">Utilization</th>
                     <td>
@@ -118,24 +118,20 @@
               </table>
             </div>
         </div>
-        {% include 'inc/custom_fields_panel.html' %}
         {% plugin_left_page object %}
     </div>
-    <div class="col col-md-7">
-        {% if duplicate_prefix_table.rows %}
-            {% include 'inc/panel_table.html' with table=duplicate_prefix_table heading='Duplicate Prefixes' %}
-        {% endif %}
-        {% include 'inc/panel_table.html' with table=parent_prefix_table heading='Parent Prefixes' %}
+    <div class="col col-md-6">
+        {% include 'inc/custom_fields_panel.html' %}
+        {% include 'extras/inc/tags_panel.html' with tags=object.tags.all url='ipam:prefix_list' %}
         {% plugin_right_page object %}
     </div>
 </div>
-<div class="row my-3">
-    <div class="col col-md-5">
-    {% include 'extras/inc/tags_panel.html' with tags=object.tags.all url='ipam:prefix_list' %}
-    </div>
-</div>
 <div class="row">
     <div class="col col-md-12">
+        {% if duplicate_prefix_table.rows %}
+            {% include 'inc/panel_table.html' with table=duplicate_prefix_table heading='Duplicate Prefixes' %}
+        {% endif %}
+        {% include 'inc/panel_table.html' with table=parent_prefix_table heading='Parent Prefixes' %}
         {% plugin_full_width_page object %}
     </div>
 </div>

+ 2 - 9
netbox/templates/ipam/routetarget.html

@@ -32,7 +32,8 @@
                 </table>
             </div>
         </div>
-        
+        {% include 'extras/inc/tags_panel.html' with tags=object.tags.all url='ipam:routetarget_list' %}
+        {% include 'inc/custom_fields_panel.html' %}
         {% plugin_left_page object %}
 	</div>
 	<div class="col col-md-6">
@@ -43,14 +44,6 @@
         {% plugin_right_page object %}
     </div>
 </div>
-<div class="row my-3">
-    <div class="col col-md-6">
-    {% include 'extras/inc/tags_panel.html' with tags=object.tags.all url='ipam:routetarget_list' %}
-    </div>
-    <div class="col col-md-6">
-    {% include 'inc/custom_fields_panel.html' %}
-    </div>
-</div>
 <div class="row">
     <div class="col col-md-12">
         {% plugin_full_width_page object %}

+ 2 - 2
netbox/templates/ipam/service.html

@@ -57,11 +57,11 @@
                 </table>
             </div>
         </div>
-        {% include 'inc/custom_fields_panel.html' %}
-        {% include 'extras/inc/tags_panel.html' with tags=object.tags.all url='ipam:service_list' %}
         {% plugin_left_page object %}
     </div>
     <div class="col col-md-6">
+        {% include 'inc/custom_fields_panel.html' %}
+        {% include 'extras/inc/tags_panel.html' with tags=object.tags.all url='ipam:service_list' %}
         {% plugin_right_page object %}
     </div>
 </div>

+ 14 - 13
netbox/templates/ipam/vlan.html

@@ -4,18 +4,13 @@
 
 {% block content %}
     <div class="row">
-        <div class="col col-md-4">
+        <div class="col col-md-6">
             <div class="card">
                 <h5 class="card-header">
                     VLAN
                 </h5>
                 <div class="card-body">
                     <table class="table table-hover attr-table">
-                        <tr>
-                            <td colspan="2">
-                                <span class="badge bg-{{ object.get_status_class }}">{{ object.get_status_display }}</span>
-                            </td>
-                        </tr>
                         <tr>
                             <th scope="row">Site</th>
                             <td>
@@ -60,6 +55,12 @@
                                 {% endif %}
                             </td>
                         </tr>
+                        <tr>
+                            <th scope="row">Status</th>
+                            <td>
+                              <span class="badge bg-{{ object.get_status_class }}">{{ object.get_status_display }}</span>
+                            </td>
+                        </tr>
                         <tr>
                             <th scope="row">Role</th>
                             <td>
@@ -77,11 +78,16 @@
                     </table>
                 </div>
             </div>
+            {% plugin_left_page object %}
+        </div>
+        <div class="col col-md-6">
             {% include 'inc/custom_fields_panel.html' %}
             {% include 'extras/inc/tags_panel.html' with tags=object.tags.all url='ipam:vlan_list' %}
-            {% plugin_left_page object %}
+            {% plugin_right_page object %}
         </div>
-        <div class="col col-md-8">
+    </div>
+    <div class="row">
+        <div class="col col-md-12">
             <div class="card">
                 <h5 class="card-header">
                     Prefixes
@@ -98,11 +104,6 @@
                 </div>
                 {% endif %}
             </div>
-            {% plugin_right_page object %}
-        </div>
-    </div>
-    <div class="row">
-        <div class="col col-md-12">
             {% plugin_full_width_page object %}
         </div>
     </div>

+ 65 - 59
netbox/templates/ipam/vrf.html

@@ -8,68 +8,74 @@
 {% block content %}
 <div class="row">
 	<div class="col col-md-6">
-        <div class="card">
-            <h5 class="card-header">
-                VRF
-            </h5>
-            <div class="card-body">
-                <table class="table table-hover attr-table">
-                    <tr>
-                        <th scope="row">Route Distinguisher</th>
-                        <td><code>{{ object.rd }}</code></td>
-                    </tr>
-                    <tr>
-                        <th scope="row">Tenant</th>
-                        <td>
-                            {% if object.tenant %}
-                                <a href="{{ object.tenant.get_absolute_url }}">{{ object.tenant }}</a>
-                            {% else %}
-                                <span class="text-muted">None</span>
-                            {% endif %}
-                        </td>
-                    </tr>
-                    <tr>
-                        <th scope="row">Unique IP Space</th>
-                        <td>
-                            {% if object.enforce_unique %}
-                                <i class="mdi mdi-check-bold text-success" title="Yes"></i>
-                            {% else %}
-                                <i class="mdi mdi-close-thick text-danger" title="No"></i>
-                            {% endif %}
-                        </td>
-                    </tr>
-                    <tr>
-                        <th scope="row">Description</th>
-                        <td>{{ object.description|placeholder }}</td>
-                    </tr>
-                    <tr>
-                        <th scope="row">Prefixes</th>
-                        <td>
-                            <a href="{% url 'ipam:prefix_list' %}?vrf_id={{ object.pk }}">{{ prefix_count }}</a>
-                        </td>
-                    </tr>
-                    <tr>
-                        <th scope="row">IP Addresses</th>
-                        <td>
-                            <a href="{% url 'ipam:ipaddress_list' %}?vrf_id={{ object.pk }}">{{ ipaddress_count }}</a>
-                        </td>
-                    </tr>
-                </table>
-            </div>
-        </div>
-        {% include 'extras/inc/tags_panel.html' with tags=object.tags.all url='ipam:vrf_list' %}
-        {% include 'inc/custom_fields_panel.html' %}
-        {% plugin_left_page object %}
+      <div class="card">
+          <h5 class="card-header">
+              VRF
+          </h5>
+          <div class="card-body">
+              <table class="table table-hover attr-table">
+                  <tr>
+                      <th scope="row">Route Distinguisher</th>
+                      <td>{{ object.rd|placeholder }}</td>
+                  </tr>
+                  <tr>
+                      <th scope="row">Tenant</th>
+                      <td>
+                          {% if object.tenant %}
+                              <a href="{{ object.tenant.get_absolute_url }}">{{ object.tenant }}</a>
+                          {% else %}
+                              <span class="text-muted">None</span>
+                          {% endif %}
+                      </td>
+                  </tr>
+                  <tr>
+                      <th scope="row">Unique IP Space</th>
+                      <td>
+                          {% if object.enforce_unique %}
+                              <i class="mdi mdi-check-bold text-success" title="Yes"></i>
+                          {% else %}
+                              <i class="mdi mdi-close-thick text-danger" title="No"></i>
+                          {% endif %}
+                      </td>
+                  </tr>
+                  <tr>
+                      <th scope="row">Description</th>
+                      <td>{{ object.description|placeholder }}</td>
+                  </tr>
+                  <tr>
+                      <th scope="row">Prefixes</th>
+                      <td>
+                          <a href="{% url 'ipam:prefix_list' %}?vrf_id={{ object.pk }}">{{ prefix_count }}</a>
+                      </td>
+                  </tr>
+                  <tr>
+                      <th scope="row">IP Addresses</th>
+                      <td>
+                          <a href="{% url 'ipam:ipaddress_list' %}?vrf_id={{ object.pk }}">{{ ipaddress_count }}</a>
+                      </td>
+                  </tr>
+              </table>
+          </div>
+      </div>
+      {% plugin_left_page object %}
+  </div>
+  <div class="col col-md-6">
+    {% include 'extras/inc/tags_panel.html' with tags=object.tags.all url='ipam:vrf_list' %}
+    {% include 'inc/custom_fields_panel.html' %}
+    {% plugin_right_page object %}
 	</div>
+</div>
+<div class="row">
+	<div class="col col-md-6">
+    {% include 'inc/panel_table.html' with table=import_targets_table heading="Import Route Targets" %}
+  </div>
 	<div class="col col-md-6">
-        {% include 'inc/panel_table.html' with table=import_targets_table heading="Import Route Targets" %}
-        {% include 'inc/panel_table.html' with table=export_targets_table heading="Export Route Targets" %}
-        {% plugin_right_page object %}
-    </div>
+    {% include 'inc/panel_table.html' with table=export_targets_table heading="Export Route Targets" %}
+  </div>
 </div>
 <div class="row">
-    <div class="col col-md-12">
-        {% plugin_full_width_page object %}
-    </div>
+  <div class="col col-md-12">
+    {% plugin_full_width_page object %}
+  </div>
 </div>
 {% endblock %}

+ 2 - 2
netbox/templates/users/base.html

@@ -4,7 +4,7 @@
 
 {% block content %}
 <div class="row">
-    <div class="col-sm-3 col-md-2 col-md-offset-1 border-end">
+    <div class="col-sm-3 col-md-2 border-end">
         <nav class="nav nav-pills nav-justified flex-column">
             <a class="nav-item nav-link text-start{% if active_tab == 'profile' %} active{% endif %}" href="{% url 'user:profile' %}">Profile</a>
             <a class="nav-link nav-item text-start{% if active_tab == 'preferences' %} active{% endif %}" href="{% url 'user:preferences' %}">Preferences</a>
@@ -14,7 +14,7 @@
             <a class="nav-link nav-item text-start{% if active_tab == 'api-tokens' %} active{% endif %}" href="{% url 'user:token_list' %}">API Tokens</a>
         </nav>
     </div>
-	<div class="col-sm-9 col-md-8 px-4">
+	<div class="col-sm-9 col-md-10 px-4">
         {% block usercontent %}{% endblock %}
 	</div>
 </div>

+ 68 - 65
netbox/templates/virtualization/cluster.html

@@ -4,74 +4,77 @@
 
 {% block content %}
 <div class="row">
-	<div class="col col-md-5">
-        <div class="card">
-            <h5 class="card-header">
-                Cluster
-            </h5>
-            <div class="card-body">
-                <table class="table table-hover attr-table">
-                    <tr>
-                        <th scope="row">Name</th>
-                        <td>{{ object.name }}</td>
-                    </tr>
-                    <tr>
-                        <th scope="row">Type</th>
-                        <td><a href="{{ object.type.get_absolute_url }}">{{ object.type }}</a></td>
-                    </tr>
-                    <tr>
-                        <th scope="row">Group</th>
-                        <td>
-                            {% if object.group %}
-                                <a href="{{ object.group.get_absolute_url }}">{{ object.group }}</a>
-                            {% else %}
-                                <span class="text-muted">None</span>
-                            {% endif %}
-                        </td>
-                    </tr>
-                    <tr>
-                        <th scope="row">Tenant</th>
-                        <td>
-                            {% if object.tenant %}
-                                <a href="{{ object.tenant.get_absolute_url }}">{{ object.tenant }}</a>
-                            {% else %}
-                                <span class="text-muted">None</span>
-                            {% endif %}
-                        </td>
-                    </tr>
-                    <tr>
-                        <th scope="row">Site</th>
-                        <td>
-                            {% if object.site %}
-                                <a href="{{ object.site.get_absolute_url }}">{{ object.site }}</a>
-                            {% else %}
-                                <span class="text-muted">None</span>
-                            {% endif %}
-                        </td>
-                    </tr>
-                    <tr>
-                        <th scope="row">Virtual Machines</th>
-                        <td><a href="{% url 'virtualization:virtualmachine_list' %}?cluster_id={{ object.pk }}">{{ object.virtual_machines.count }}</a></td>
-                    </tr>
-                </table>
-            </div>
+  <div class="col col-md-6">
+    <div class="card">
+        <h5 class="card-header">
+            Cluster
+        </h5>
+        <div class="card-body">
+            <table class="table table-hover attr-table">
+                <tr>
+                    <th scope="row">Name</th>
+                    <td>{{ object.name }}</td>
+                </tr>
+                <tr>
+                    <th scope="row">Type</th>
+                    <td><a href="{{ object.type.get_absolute_url }}">{{ object.type }}</a></td>
+                </tr>
+                <tr>
+                    <th scope="row">Group</th>
+                    <td>
+                        {% if object.group %}
+                            <a href="{{ object.group.get_absolute_url }}">{{ object.group }}</a>
+                        {% else %}
+                            <span class="text-muted">None</span>
+                        {% endif %}
+                    </td>
+                </tr>
+                <tr>
+                    <th scope="row">Tenant</th>
+                    <td>
+                        {% if object.tenant %}
+                            <a href="{{ object.tenant.get_absolute_url }}">{{ object.tenant }}</a>
+                        {% else %}
+                            <span class="text-muted">None</span>
+                        {% endif %}
+                    </td>
+                </tr>
+                <tr>
+                    <th scope="row">Site</th>
+                    <td>
+                        {% if object.site %}
+                            <a href="{{ object.site.get_absolute_url }}">{{ object.site }}</a>
+                        {% else %}
+                            <span class="text-muted">None</span>
+                        {% endif %}
+                    </td>
+                </tr>
+                <tr>
+                    <th scope="row">Virtual Machines</th>
+                    <td><a href="{% url 'virtualization:virtualmachine_list' %}?cluster_id={{ object.pk }}">{{ object.virtual_machines.count }}</a></td>
+                </tr>
+            </table>
         </div>
-        {% include 'inc/custom_fields_panel.html' %}
-        {% include 'extras/inc/tags_panel.html' with tags=object.tags.all url='virtualization:cluster_list' %}
-        <div class="card">
-            <h5 class="card-header">
-                Comments
-            </h5>
-            <div class="card-body rendered-markdown">
-                {% if object.comments %}
-                    {{ object.comments|render_markdown }}
-                {% else %}
-                    <span class="text-muted">None</span>
-                {% endif %}
-            </div>
+    </div>
+    <div class="card">
+        <h5 class="card-header">
+            Comments
+        </h5>
+        <div class="card-body rendered-markdown">
+            {% if object.comments %}
+                {{ object.comments|render_markdown }}
+            {% else %}
+                <span class="text-muted">None</span>
+            {% endif %}
         </div>
-        {% plugin_left_page object %}
     </div>
+    {% plugin_left_page object %}
+  </div>
+  <div class="col col-md-6">
+    {% include 'inc/custom_fields_panel.html' %}
+    {% include 'extras/inc/tags_panel.html' with tags=object.tags.all url='virtualization:cluster_list' %}
+    {% plugin_right_page object %}
+  </div>
 </div>
 <div class="row">
   <div class="col col-md-12">

+ 1 - 1
netbox/templates/virtualization/vminterface.html

@@ -61,7 +61,7 @@
                     </tr>
                     <tr>
                         <th scope="row">802.1Q Mode</th>
-                        <td>{{ object.get_mode_display }}</td>
+                        <td>{{ object.get_mode_display|placeholder }}</td>
                     </tr>
                 </table>
             </div>

Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff