layout.html 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. {# Base layout for the core NetBox UI w/navbar and page content #}
  2. {% extends 'base/base.html' %}
  3. {% load helpers %}
  4. {% load nav %}
  5. {% load search_options %}
  6. {% load static %}
  7. {% block layout %}
  8. <div class="container-fluid px-0">
  9. <main class="ms-sm-auto">
  10. {# Sidebar #}
  11. <nav id="sidebar-menu" class="d-md-block sidebar collapse px-0" data-simplebar>
  12. {# Sidebar content #}
  13. <div class="position-sticky">
  14. {# Logo #}
  15. <div class="py-2">
  16. <a class="sidebar-logo d-none d-md-flex justify-content-center" href="{% url 'home' %}">
  17. <img src="{% static 'netbox_logo.svg' %}" alt="NetBox logo" />
  18. </a>
  19. </div>
  20. <ul class="nav flex-column">
  21. {# Search bar for collapsed menu #}
  22. <div class="d-block d-md-none mx-1 my-3 search-container">
  23. {% search_options %}
  24. </div>
  25. <div class="d-flex d-md-none mx-1 my-3 justify-content-center justify-content-md-end order-last order-md-0">
  26. {% include 'inc/profile_button.html' %}
  27. </div>
  28. {# Navigation menu #}
  29. {% nav %}
  30. </ul>
  31. </div>
  32. {# Sidebar footer #}
  33. <div class="d-flex flex-column container-fluid mt-auto justify-content-end sidebar-bottom">
  34. <nav class="nav">
  35. {# Documentation #}
  36. <a type="button" class="nav-link" href="{% static 'docs/' %}" target="_blank">
  37. <i title="Docs" class="mdi mdi-book-open-variant text-primary" data-bs-placement="top" data-bs-toggle="tooltip"></i>
  38. </a>
  39. {# REST API #}
  40. <a type="button" class="nav-link" href="{% url 'api-root' %}" target="_blank">
  41. <i title="REST API" class="mdi mdi-cloud-braces text-primary" data-bs-placement="top" data-bs-toggle="tooltip"></i>
  42. </a>
  43. {# API docs #}
  44. <a type="button" class="nav-link" href="{% url 'api_docs' %}" target="_blank">
  45. <i title="REST API documentation" class="mdi mdi-book text-primary" data-bs-placement="top" data-bs-toggle="tooltip"></i>
  46. </a>
  47. {# GraphQL API #}
  48. {% if settings.GRAPHQL_ENABLED %}
  49. <a type="button" class="nav-link" href="{% url 'graphql' %}" target="_blank">
  50. <i title="GraphQL API" class="mdi mdi-graphql text-primary" data-bs-placement="top" data-bs-toggle="tooltip"></i>
  51. </a>
  52. {% endif %}
  53. {# GitHub #}
  54. <a type="button" class="nav-link" href="https://github.com/netbox-community/netbox" target="_blank">
  55. <i title="Source Code" class="mdi mdi-github text-primary" data-bs-placement="top" data-bs-toggle="tooltip"></i>
  56. </a>
  57. {# NetDev Slack #}
  58. <a type="button" class="nav-link" href="https://netdev.chat/" target="_blank">
  59. <i title="Community" class="mdi mdi-slack text-primary" data-bs-placement="top" data-bs-toggle="tooltip"></i>
  60. </a>
  61. </nav>
  62. </div>
  63. </nav>
  64. {# Body #}
  65. <div class="content-container">
  66. {# Top bar #}
  67. <nav class="navbar navbar-light sticky-top flex-md-nowrap p-3 search container-fluid">
  68. <div class="d-md-none w-100 d-flex justify-content-between align-items-center my-3">
  69. <a class="p-2 sidebar-logo d-block d-md-none" href="{% url 'home' %}">
  70. <img src="{% static 'netbox_logo.svg' %}" alt="NetBox logo" width="100%" />
  71. </a>
  72. <button
  73. type="button"
  74. aria-expanded="false"
  75. data-bs-toggle="collapse"
  76. aria-controls="sidebar-menu"
  77. data-bs-target="#sidebar-menu"
  78. aria-label="Toggle Navigation"
  79. class="navbar-toggler position-relative collapsed"
  80. >
  81. <span class="navbar-toggler-icon"></span>
  82. </button>
  83. </div>
  84. <div class="d-none d-md-flex w-100 search-container">
  85. {% search_options %}
  86. {% include 'inc/profile_button.html' %}
  87. </div>
  88. </nav>
  89. {% if settings.BANNER_TOP %}
  90. <div class="alert alert-info text-center mx-3" role="alert">
  91. {{ settings.BANNER_TOP|safe }}
  92. </div>
  93. {% endif %}
  94. {% if settings.MAINTENANCE_MODE %}
  95. <div class="alert alert-warning text-center mx-3" role="alert">
  96. <h4><i class="mdi mdi-alert"></i> Maintenance Mode</h4>
  97. <span>NetBox is currently in maintenance mode. Functionality may be limited.</span>
  98. </div>
  99. {% endif %}
  100. {# Page header #}
  101. {% block header %}
  102. <div class="title-container px-3 pb-3">
  103. {# Title #}
  104. <div id="content-title">
  105. {# Center-align title in object-edit views #}
  106. <h1 class="h2 w-100">{% block title %}{% endblock title %}</h1>
  107. {% block subtitle %}{% endblock %}
  108. </div>
  109. {# Controls #}
  110. {% block controls %}{% endblock controls %}
  111. </div>
  112. {% endblock header %}
  113. {# Page content #}
  114. <div id="content" class="container-fluid content px-0 m-0">
  115. {% block tabs %}{% endblock %}
  116. {% block content-wrapper %}
  117. <div class="px-3">
  118. {% block content %}{% endblock %}
  119. </div>
  120. {% endblock %}
  121. </div>
  122. {% if settings.BANNER_BOTTOM %}
  123. <div class="alert alert-info text-center mx-3" role="alert">
  124. {{ settings.BANNER_BOTTOM|safe }}
  125. </div>
  126. {% endif %}
  127. {# Page footer #}
  128. <footer class="footer container-fluid pb-3 pt-4 px-0">
  129. <div class="row align-items-center justify-content-end mx-0">
  130. <div class="col text-center small text-muted">
  131. <span class="fw-light d-block d-md-inline">{% annotated_now %} {% now 'T' %}</span>
  132. <span class="ms-md-3 d-block d-md-inline">{{ settings.HOSTNAME }} (v{{ settings.VERSION }})</span>
  133. </div>
  134. </div>
  135. </footer>
  136. </div>
  137. </main>
  138. </div>
  139. {% endblock layout %}