nautobot 2.4.21__py3-none-any.whl → 3.0.0a3__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of nautobot might be problematic. Click here for more details.

Files changed (919) hide show
  1. nautobot/apps/choices.py +2 -2
  2. nautobot/apps/filters.py +9 -9
  3. nautobot/apps/forms.py +2 -0
  4. nautobot/apps/models.py +7 -2
  5. nautobot/apps/ui.py +20 -1
  6. nautobot/apps/utils.py +2 -3
  7. nautobot/apps/views.py +7 -1
  8. nautobot/circuits/filters.py +8 -23
  9. nautobot/circuits/navigation.py +3 -1
  10. nautobot/circuits/templates/circuits/circuit_create.html +9 -9
  11. nautobot/circuits/templates/circuits/circuit_terminations_swap.html +2 -2
  12. nautobot/circuits/templates/circuits/circuittermination_create.html +24 -33
  13. nautobot/circuits/templates/circuits/inc/circuit_termination.html +10 -10
  14. nautobot/circuits/templates/circuits/inc/circuit_termination_cable_fragment.html +13 -13
  15. nautobot/circuits/templates/circuits/inc/circuit_termination_header_extra_content.html +6 -6
  16. nautobot/circuits/templates/circuits/inc/circuit_termination_speed_fragment.html +3 -3
  17. nautobot/circuits/templates/circuits/inc/speed_widget.html +13 -13
  18. nautobot/circuits/templates/circuits/provider_create.html +9 -9
  19. nautobot/circuits/tests/integration/test_circuit.py +19 -19
  20. nautobot/circuits/tests/integration/test_circuits_bulk_operations.py +3 -0
  21. nautobot/circuits/tests/integration/test_relationships.py +4 -12
  22. nautobot/circuits/views.py +0 -2
  23. nautobot/cloud/filters.py +1 -13
  24. nautobot/cloud/navigation.py +3 -1
  25. nautobot/cloud/templates/cloud/cloudnetwork_update.html +9 -9
  26. nautobot/cloud/templates/cloud/cloudservice_update.html +6 -6
  27. nautobot/core/api/fields.py +30 -2
  28. nautobot/core/api/schema.py +1 -1
  29. nautobot/core/api/serializers.py +9 -2
  30. nautobot/core/api/urls.py +2 -0
  31. nautobot/core/api/views.py +58 -37
  32. nautobot/core/apps/__init__.py +6 -12
  33. nautobot/core/branching.py +83 -0
  34. nautobot/core/celery/__init__.py +11 -6
  35. nautobot/core/celery/backends.py +2 -0
  36. nautobot/core/celery/encoders.py +7 -0
  37. nautobot/core/celery/task.py +44 -0
  38. nautobot/core/checks.py +60 -0
  39. nautobot/core/cli/bootstrap_v3_to_v5.py +776 -0
  40. nautobot/core/constants.py +9 -0
  41. nautobot/core/context_processors.py +84 -0
  42. nautobot/core/filters.py +131 -2
  43. nautobot/core/forms/__init__.py +4 -2
  44. nautobot/core/forms/fields.py +10 -8
  45. nautobot/core/forms/forms.py +21 -9
  46. nautobot/core/forms/search.py +0 -15
  47. nautobot/core/forms/widgets.py +3 -2
  48. nautobot/core/graphql/__init__.py +8 -26
  49. nautobot/core/graphql/generators.py +16 -6
  50. nautobot/core/graphql/schema.py +1 -1
  51. nautobot/core/graphql/schema_init.py +1 -2
  52. nautobot/core/graphql/utils.py +7 -9
  53. nautobot/core/jobs/__init__.py +158 -0
  54. nautobot/core/management/commands/generate_test_data.py +28 -9
  55. nautobot/core/models/__init__.py +17 -2
  56. nautobot/core/models/fields.py +3 -2
  57. nautobot/core/models/generics.py +9 -1
  58. nautobot/core/models/name_color_content_types.py +1 -1
  59. nautobot/core/models/ordering.py +7 -5
  60. nautobot/core/models/querysets.py +77 -2
  61. nautobot/core/models/tree_queries.py +6 -4
  62. nautobot/core/settings.py +30 -16
  63. nautobot/core/settings.yaml +13 -7
  64. nautobot/core/tables.py +114 -44
  65. nautobot/core/templates/403.html +1 -1
  66. nautobot/core/templates/403_csrf_failure.html +1 -1
  67. nautobot/core/templates/404.html +1 -1
  68. nautobot/core/templates/40x.html +8 -8
  69. nautobot/core/templates/500.html +10 -10
  70. nautobot/core/templates/about.html +13 -12
  71. nautobot/core/templates/admin/actions.html +1 -1
  72. nautobot/core/templates/admin/app_index.html +3 -3
  73. nautobot/core/templates/admin/base.html +45 -52
  74. nautobot/core/templates/admin/base_site.html +0 -9
  75. nautobot/core/templates/admin/change_form.html +5 -5
  76. nautobot/core/templates/admin/change_list.html +8 -12
  77. nautobot/core/templates/admin/change_list_results.html +3 -3
  78. nautobot/core/templates/admin/config/config.html +24 -24
  79. nautobot/core/templates/admin/delete_confirmation.html +5 -5
  80. nautobot/core/templates/admin/edit_inline/stacked.html +5 -5
  81. nautobot/core/templates/admin/edit_inline/tabular.html +3 -3
  82. nautobot/core/templates/admin/includes/fieldset.html +15 -15
  83. nautobot/core/templates/admin/index.html +8 -8
  84. nautobot/core/templates/admin/submit_line.html +5 -5
  85. nautobot/core/templates/base_django.html +36 -32
  86. nautobot/core/templates/buttons/add.html +1 -1
  87. nautobot/core/templates/buttons/consolidated_detail_view_action_buttons.html +2 -2
  88. nautobot/core/templates/buttons/export.html +17 -18
  89. nautobot/core/templates/buttons/job_import.html +2 -2
  90. nautobot/core/templates/components/breadcrumbs.html +19 -17
  91. nautobot/core/templates/components/button/dropdown.html +7 -5
  92. nautobot/core/templates/components/echarts.html +2 -0
  93. nautobot/core/templates/components/layout/one_over_two.html +3 -3
  94. nautobot/core/templates/components/layout/two_over_one.html +3 -3
  95. nautobot/core/templates/components/panel/body_content_data_table.html +2 -2
  96. nautobot/core/templates/components/panel/body_content_tags.html +1 -1
  97. nautobot/core/templates/components/panel/body_wrapper_generic.html +4 -2
  98. nautobot/core/templates/components/panel/body_wrapper_generic_table.html +1 -1
  99. nautobot/core/templates/components/panel/body_wrapper_key_value_table.html +5 -3
  100. nautobot/core/templates/components/panel/body_wrapper_table.html +4 -2
  101. nautobot/core/templates/components/panel/footer_contacts_table.html +4 -4
  102. nautobot/core/templates/components/panel/footer_content_table.html +3 -3
  103. nautobot/core/templates/components/panel/grouping_toggle.html +12 -11
  104. nautobot/core/templates/components/panel/header_extra_content_table.html +2 -11
  105. nautobot/core/templates/components/panel/panel.html +6 -3
  106. nautobot/core/templates/components/panel/stats_panel_body.html +9 -7
  107. nautobot/core/templates/components/tab/content_wrapper.html +29 -1
  108. nautobot/core/templates/components/tab/label_wrapper.html +10 -2
  109. nautobot/core/templates/components/tab/label_wrapper_distinct_view.html +11 -4
  110. nautobot/core/templates/echarts/echarts.html +20 -0
  111. nautobot/core/templates/exceptions/import_error.html +2 -2
  112. nautobot/core/templates/exceptions/permission_error.html +1 -1
  113. nautobot/core/templates/exceptions/programming_error.html +2 -2
  114. nautobot/core/templates/generic/object_bulk_add_component.html +29 -20
  115. nautobot/core/templates/generic/object_bulk_create.html +87 -75
  116. nautobot/core/templates/generic/object_bulk_destroy.html +35 -37
  117. nautobot/core/templates/generic/object_bulk_remove.html +30 -26
  118. nautobot/core/templates/generic/object_bulk_rename.html +53 -40
  119. nautobot/core/templates/generic/object_bulk_update.html +36 -29
  120. nautobot/core/templates/generic/object_create.html +40 -27
  121. nautobot/core/templates/generic/object_import.html +36 -24
  122. nautobot/core/templates/generic/object_list.html +279 -215
  123. nautobot/core/templates/generic/object_notes.html +21 -11
  124. nautobot/core/templates/generic/object_retrieve.html +161 -213
  125. nautobot/core/templates/graphene/graphiql.html +113 -60
  126. nautobot/core/templates/home.html +164 -87
  127. nautobot/core/templates/import_success.html +3 -2
  128. nautobot/core/templates/inc/ajax_loader.html +1 -1
  129. nautobot/core/templates/inc/computed_fields/panel_data.html +25 -13
  130. nautobot/core/templates/inc/created_updated.html +12 -7
  131. nautobot/core/templates/inc/custom_fields/panel_data.html +28 -16
  132. nautobot/core/templates/inc/custom_fields_panel.html +3 -3
  133. nautobot/core/templates/inc/dynamic_groups_panel.html +3 -3
  134. nautobot/core/templates/inc/extras_features_edit_form_fields.html +15 -15
  135. nautobot/core/templates/inc/footer.html +90 -40
  136. nautobot/core/templates/inc/form_static_field.html +6 -0
  137. nautobot/core/templates/inc/header.html +75 -0
  138. nautobot/core/templates/inc/header_banners.html +17 -0
  139. nautobot/core/templates/inc/header_messages.html +6 -0
  140. nautobot/core/templates/inc/image_attachments.html +9 -9
  141. nautobot/core/templates/inc/javascript.html +7 -24
  142. nautobot/core/templates/inc/media.html +4 -29
  143. nautobot/core/templates/inc/modal.html +2 -2
  144. nautobot/core/templates/inc/nav_favorites.html +27 -0
  145. nautobot/core/templates/inc/nav_menu.html +150 -108
  146. nautobot/core/templates/inc/object_details_advanced_panel.html +84 -71
  147. nautobot/core/templates/inc/page_title.html +23 -0
  148. nautobot/core/templates/inc/paginator.html +39 -28
  149. nautobot/core/templates/inc/relationships/panel_override.html +3 -3
  150. nautobot/core/templates/inc/relationships_panel.html +3 -3
  151. nautobot/core/templates/inc/relationships_table_rows.html +1 -1
  152. nautobot/core/templates/inc/search_panel.html +22 -16
  153. nautobot/core/templates/inc/table.html +61 -36
  154. nautobot/core/templates/inc/tenancy_form_panel.html +3 -3
  155. nautobot/core/templates/login.html +17 -59
  156. nautobot/core/templates/modals/modal_theme.html +12 -23
  157. nautobot/core/templates/nautobot_config.py.j2 +6 -5
  158. nautobot/core/templates/panel_table.html +8 -12
  159. nautobot/core/templates/redoc_ui.html +80 -0
  160. nautobot/core/templates/rest_framework/api.html +43 -21
  161. nautobot/core/templates/search.html +12 -13
  162. nautobot/core/templates/swagger_ui.html +19 -4
  163. nautobot/core/templates/system_jobs/import_objects.html +70 -58
  164. nautobot/core/templates/template.css +0 -6
  165. nautobot/core/templates/utilities/comment_form.html +34 -0
  166. nautobot/core/templates/utilities/confirmation_form.html +17 -9
  167. nautobot/core/templates/utilities/obj_table.html +19 -11
  168. nautobot/core/templates/utilities/render_field.html +27 -21
  169. nautobot/core/templates/utilities/render_jinja2.html +22 -25
  170. nautobot/core/templates/utilities/templatetags/advanced_filter_indicator.html +8 -0
  171. nautobot/core/templates/utilities/templatetags/badge.html +1 -1
  172. nautobot/core/templates/utilities/templatetags/dynamic_group_assignment_modal.html +2 -3
  173. nautobot/core/templates/utilities/templatetags/filter_form_drawer.html +482 -0
  174. nautobot/core/templates/utilities/templatetags/modal_form_as_dialog.html +14 -18
  175. nautobot/core/templates/utilities/templatetags/saved_view_modal.html +11 -11
  176. nautobot/core/templates/utilities/templatetags/table_config_form.html +51 -24
  177. nautobot/core/templates/utilities/templatetags/tag.html +1 -1
  178. nautobot/core/templates/utilities/templatetags/utilization_graph.html +3 -3
  179. nautobot/core/templates/utilities/theme_preview.html +829 -566
  180. nautobot/core/templates/utilities/worker_status.html +42 -41
  181. nautobot/core/templates/widgets/selectwithdisabled_option.html +3 -1
  182. nautobot/core/templates/widgets/sluginput.html +2 -2
  183. nautobot/core/templatetags/buttons.py +38 -40
  184. nautobot/core/templatetags/helpers.py +105 -28
  185. nautobot/core/templatetags/ui_framework.py +17 -0
  186. nautobot/core/testing/api.py +76 -12
  187. nautobot/core/testing/filters.py +11 -27
  188. nautobot/core/testing/integration.py +128 -10
  189. nautobot/core/testing/mixins.py +7 -4
  190. nautobot/core/testing/utils.py +28 -5
  191. nautobot/core/testing/views.py +125 -27
  192. nautobot/core/tests/integration/test_app_home.py +39 -35
  193. nautobot/core/tests/integration/test_app_navbar.py +60 -67
  194. nautobot/core/tests/integration/test_filters.py +123 -55
  195. nautobot/core/tests/integration/test_general_functionality.py +1 -1
  196. nautobot/core/tests/integration/test_home.py +10 -18
  197. nautobot/core/tests/integration/test_import_objects_ui.py +2 -9
  198. nautobot/core/tests/integration/test_navbar.py +41 -16
  199. nautobot/core/tests/integration/test_swagger.py +1 -7
  200. nautobot/core/tests/integration/test_theme.py +3 -0
  201. nautobot/core/tests/nautobot_config_without_example_apps.py +4 -0
  202. nautobot/core/tests/runner.py +6 -1
  203. nautobot/core/tests/test_api.py +5 -3
  204. nautobot/core/tests/test_branching.py +154 -0
  205. nautobot/core/tests/test_breadcrumbs.py +7 -8
  206. nautobot/core/tests/test_checks.py +28 -0
  207. nautobot/core/tests/test_commands.py +0 -41
  208. nautobot/core/tests/test_config.py +2 -1
  209. nautobot/core/tests/test_csv.py +4 -7
  210. nautobot/core/tests/test_filters.py +326 -318
  211. nautobot/core/tests/test_forms.py +19 -30
  212. nautobot/core/tests/test_graphql.py +67 -57
  213. nautobot/core/tests/test_models.py +1 -1
  214. nautobot/core/tests/test_nautobot_server.py +2 -0
  215. nautobot/core/tests/test_navigations.py +78 -10
  216. nautobot/core/tests/test_tables.py +3 -1
  217. nautobot/core/tests/test_templatetags_helpers.py +61 -21
  218. nautobot/core/tests/test_templatetags_ui_framework.py +36 -18
  219. nautobot/core/tests/test_ui.py +207 -2
  220. nautobot/core/tests/test_utils.py +147 -2
  221. nautobot/core/tests/test_views.py +201 -64
  222. nautobot/core/tests/test_views_utils.py +1 -1
  223. nautobot/core/ui/breadcrumbs.py +2 -12
  224. nautobot/core/ui/choices.py +190 -0
  225. nautobot/core/ui/constants.py +86 -0
  226. nautobot/core/ui/echarts.py +474 -0
  227. nautobot/core/ui/nav.py +5 -1
  228. nautobot/core/ui/object_detail.py +180 -16
  229. nautobot/core/urls.py +13 -1
  230. nautobot/core/utils/cache.py +71 -0
  231. nautobot/core/utils/data.py +8 -5
  232. nautobot/core/utils/filtering.py +8 -2
  233. nautobot/core/utils/git.py +3 -3
  234. nautobot/core/utils/lookup.py +87 -13
  235. nautobot/core/utils/migrations.py +22 -0
  236. nautobot/core/utils/module_loading.py +26 -0
  237. nautobot/core/utils/permissions.py +9 -5
  238. nautobot/core/views/__init__.py +114 -63
  239. nautobot/core/views/generic.py +34 -27
  240. nautobot/core/views/mixins.py +49 -27
  241. nautobot/core/views/renderers.py +3 -5
  242. nautobot/core/views/utils.py +10 -5
  243. nautobot/core/views/viewsets.py +2 -1
  244. nautobot/data_validation/__init__.py +0 -0
  245. nautobot/data_validation/api/__init__.py +1 -0
  246. nautobot/data_validation/api/serializers.py +80 -0
  247. nautobot/data_validation/api/urls.py +20 -0
  248. nautobot/data_validation/api/views.py +44 -0
  249. nautobot/data_validation/apps.py +18 -0
  250. nautobot/data_validation/custom_validators.py +330 -0
  251. nautobot/data_validation/filters.py +133 -0
  252. nautobot/data_validation/form_mixin.py +25 -0
  253. nautobot/data_validation/forms.py +342 -0
  254. nautobot/data_validation/migrations/0001_initial.py +224 -0
  255. nautobot/data_validation/migrations/0002_data_migration_from_app.py +324 -0
  256. nautobot/data_validation/migrations/__init__.py +0 -0
  257. nautobot/data_validation/models.py +361 -0
  258. nautobot/data_validation/navigation.py +74 -0
  259. nautobot/data_validation/signals.py +30 -0
  260. nautobot/data_validation/tables.py +259 -0
  261. nautobot/data_validation/templates/data_validation/datacompliance_retrieve.html +1 -0
  262. nautobot/data_validation/templates/data_validation/datacompliance_tab.html +11 -0
  263. nautobot/data_validation/templates/data_validation/device_constraints.html +61 -0
  264. nautobot/data_validation/tests/__init__.py +20 -0
  265. nautobot/data_validation/tests/migrations/__init__.py +0 -0
  266. nautobot/data_validation/tests/migrations/test_migrations.py +489 -0
  267. nautobot/data_validation/tests/test_api.py +238 -0
  268. nautobot/data_validation/tests/test_custom_validators.py +423 -0
  269. nautobot/data_validation/tests/test_data_compliance_rules.py +85 -0
  270. nautobot/data_validation/tests/test_filters.py +240 -0
  271. nautobot/data_validation/tests/test_form_mixin.py +115 -0
  272. nautobot/data_validation/tests/test_models.py +393 -0
  273. nautobot/data_validation/tests/test_views.py +435 -0
  274. nautobot/data_validation/urls.py +21 -0
  275. nautobot/data_validation/views.py +227 -0
  276. nautobot/dcim/api/serializers.py +10 -13
  277. nautobot/dcim/api/urls.py +2 -0
  278. nautobot/dcim/api/views.py +7 -0
  279. nautobot/dcim/apps.py +4 -0
  280. nautobot/dcim/choices.py +16 -0
  281. nautobot/dcim/custom_validators.py +84 -0
  282. nautobot/dcim/filter_mixins.py +353 -4
  283. nautobot/dcim/{filters/__init__.py → filters.py} +70 -157
  284. nautobot/dcim/forms.py +12 -6
  285. nautobot/dcim/graphql/types.py +1 -0
  286. nautobot/dcim/migrations/0075_add_deviceclusterassignment.py +52 -0
  287. nautobot/dcim/migrations/0076_device_cluster_to_clusters_data_migration.py +40 -0
  288. nautobot/dcim/migrations/0077_remove_device_cluster.py +14 -0
  289. nautobot/dcim/migrations/0078_remove_device_location_tenant_name_uniqueness.py +16 -0
  290. nautobot/dcim/migrations/0079_device_name_data_migration.py +59 -0
  291. nautobot/dcim/models/__init__.py +2 -0
  292. nautobot/dcim/models/device_components.py +3 -1
  293. nautobot/dcim/models/devices.py +115 -51
  294. nautobot/dcim/navigation.py +7 -3
  295. nautobot/dcim/querysets.py +6 -0
  296. nautobot/dcim/signals.py +19 -0
  297. nautobot/dcim/tables/devices.py +9 -5
  298. nautobot/dcim/tables/template_code.py +191 -102
  299. nautobot/dcim/templates/dcim/cable.html +1 -1
  300. nautobot/dcim/templates/dcim/cable_connect.html +62 -146
  301. nautobot/dcim/templates/dcim/cable_retrieve.html +10 -10
  302. nautobot/dcim/templates/dcim/cable_trace.html +15 -17
  303. nautobot/dcim/templates/dcim/console_port_connection_list.html +2 -2
  304. nautobot/dcim/templates/dcim/consoleport.html +18 -17
  305. nautobot/dcim/templates/dcim/consoleserverport.html +18 -17
  306. nautobot/dcim/templates/dcim/controller_create.html +12 -8
  307. nautobot/dcim/templates/dcim/controller_wirelessnetworks.html +1 -1
  308. nautobot/dcim/templates/dcim/controllermanageddevicegroup_create.html +6 -6
  309. nautobot/dcim/templates/dcim/controllermanageddevicegroup_retrieve.html +1 -1
  310. nautobot/dcim/templates/dcim/device/config.html +17 -19
  311. nautobot/dcim/templates/dcim/device/lldp_neighbors.html +4 -4
  312. nautobot/dcim/templates/dcim/device/status.html +20 -20
  313. nautobot/dcim/templates/dcim/device_component_add.html +24 -15
  314. nautobot/dcim/templates/dcim/device_create.html +120 -120
  315. nautobot/dcim/templates/dcim/device_list.html +75 -12
  316. nautobot/dcim/templates/dcim/devicebay.html +7 -7
  317. nautobot/dcim/templates/dcim/devicebay_populate.html +29 -23
  318. nautobot/dcim/templates/dcim/deviceredundancygroup_create.html +6 -6
  319. nautobot/dcim/templates/dcim/devicetype.html +1 -1
  320. nautobot/dcim/templates/dcim/devicetype_component_add.html +25 -19
  321. nautobot/dcim/templates/dcim/devicetype_list.html +4 -4
  322. nautobot/dcim/templates/dcim/devicetype_update.html +9 -9
  323. nautobot/dcim/templates/dcim/footer_convert_to_contact_or_team_record.html +3 -3
  324. nautobot/dcim/templates/dcim/frontport.html +21 -20
  325. nautobot/dcim/templates/dcim/inc/cable_form.html +7 -7
  326. nautobot/dcim/templates/dcim/inc/cable_termination.html +1 -1
  327. nautobot/dcim/templates/dcim/inc/cable_toggle_buttons.html +18 -9
  328. nautobot/dcim/templates/dcim/inc/detail_softwareversion_softwareimagefile_rows.html +1 -1
  329. nautobot/dcim/templates/dcim/inc/device_interface_filter.html +1 -1
  330. nautobot/dcim/templates/dcim/inc/devicetype_component_table.html +10 -10
  331. nautobot/dcim/templates/dcim/inc/edit_form_softwareversion_js.html +2 -2
  332. nautobot/dcim/templates/dcim/inc/homepage_connections.html +2 -2
  333. nautobot/dcim/templates/dcim/inc/moduletype_component_table.html +10 -10
  334. nautobot/dcim/templates/dcim/inc/rack_elevation.html +2 -2
  335. nautobot/dcim/templates/dcim/interface.html +42 -22
  336. nautobot/dcim/templates/dcim/interface_connection_list.html +2 -2
  337. nautobot/dcim/templates/dcim/interface_edit.html +26 -11
  338. nautobot/dcim/templates/dcim/interfaceredundancygroupassociation_create.html +3 -3
  339. nautobot/dcim/templates/dcim/inventoryitem.html +3 -3
  340. nautobot/dcim/templates/dcim/inventoryitem_add.html +21 -10
  341. nautobot/dcim/templates/dcim/inventoryitem_bulk_delete.html +1 -1
  342. nautobot/dcim/templates/dcim/inventoryitem_edit.html +6 -4
  343. nautobot/dcim/templates/dcim/location.html +1 -1
  344. nautobot/dcim/templates/dcim/location_migrate_data_to_contact.html +24 -18
  345. nautobot/dcim/templates/dcim/location_retrieve.html +1 -1
  346. nautobot/dcim/templates/dcim/location_update.html +9 -9
  347. nautobot/dcim/templates/dcim/locationtype.html +0 -1
  348. nautobot/dcim/templates/dcim/module/base.html +67 -27
  349. nautobot/dcim/templates/dcim/module_consoleports.html +13 -15
  350. nautobot/dcim/templates/dcim/module_consoleserverports.html +13 -15
  351. nautobot/dcim/templates/dcim/module_frontports.html +13 -15
  352. nautobot/dcim/templates/dcim/module_interfaces.html +14 -16
  353. nautobot/dcim/templates/dcim/module_list.html +59 -10
  354. nautobot/dcim/templates/dcim/module_modulebays.html +12 -14
  355. nautobot/dcim/templates/dcim/module_poweroutlets.html +13 -15
  356. nautobot/dcim/templates/dcim/module_powerports.html +13 -15
  357. nautobot/dcim/templates/dcim/module_rearports.html +13 -15
  358. nautobot/dcim/templates/dcim/module_retrieve.html +3 -3
  359. nautobot/dcim/templates/dcim/module_update.html +15 -9
  360. nautobot/dcim/templates/dcim/modulebay_retrieve.html +0 -93
  361. nautobot/dcim/templates/dcim/modulefamily_retrieve.html +7 -7
  362. nautobot/dcim/templates/dcim/moduletype_list.html +2 -2
  363. nautobot/dcim/templates/dcim/moduletype_retrieve.html +74 -35
  364. nautobot/dcim/templates/dcim/platform_create.html +9 -9
  365. nautobot/dcim/templates/dcim/power_port_connection_list.html +3 -3
  366. nautobot/dcim/templates/dcim/powerfeed.html +1 -1
  367. nautobot/dcim/templates/dcim/powerfeed_edit.html +15 -15
  368. nautobot/dcim/templates/dcim/poweroutlet.html +13 -13
  369. nautobot/dcim/templates/dcim/powerpanel.html +1 -1
  370. nautobot/dcim/templates/dcim/powerport.html +17 -16
  371. nautobot/dcim/templates/dcim/rack.html +1 -1
  372. nautobot/dcim/templates/dcim/rack_elevation.html +2 -2
  373. nautobot/dcim/templates/dcim/rack_elevation_list.html +21 -9
  374. nautobot/dcim/templates/dcim/rack_retrieve.html +75 -57
  375. nautobot/dcim/templates/dcim/rack_update.html +14 -14
  376. nautobot/dcim/templates/dcim/rackreservation.html +1 -1
  377. nautobot/dcim/templates/dcim/rackreservation_edit.html +6 -6
  378. nautobot/dcim/templates/dcim/rearport.html +19 -18
  379. nautobot/dcim/templates/dcim/trace/cable.html +1 -1
  380. nautobot/dcim/templates/dcim/trace/circuit.html +1 -1
  381. nautobot/dcim/templates/dcim/trace/device.html +1 -1
  382. nautobot/dcim/templates/dcim/trace/powerpanel.html +1 -1
  383. nautobot/dcim/templates/dcim/trace/termination.html +1 -1
  384. nautobot/dcim/templates/dcim/virtualchassis.html +1 -1
  385. nautobot/dcim/templates/dcim/virtualchassis_add_member.html +25 -16
  386. nautobot/dcim/templates/dcim/virtualchassis_create.html +6 -6
  387. nautobot/dcim/templates/dcim/virtualchassis_edit.html +1 -1
  388. nautobot/dcim/templates/dcim/virtualchassis_retrieve.html +1 -1
  389. nautobot/dcim/templates/dcim/virtualchassis_update.html +36 -22
  390. nautobot/dcim/templates/dcim/virtualdevicecontext_update.html +9 -9
  391. nautobot/dcim/tests/integration/test_controller.py +6 -6
  392. nautobot/dcim/tests/integration/test_controller_managed_device_group.py +7 -7
  393. nautobot/dcim/tests/integration/test_create_device.py +9 -9
  394. nautobot/dcim/tests/integration/test_device_bulk_operations.py +7 -2
  395. nautobot/dcim/tests/integration/test_fileinputpicker.py +5 -7
  396. nautobot/dcim/tests/integration/test_location_bulk_operations.py +2 -0
  397. nautobot/dcim/tests/integration/test_module_bay_position.py +4 -1
  398. nautobot/dcim/tests/test_api.py +86 -6
  399. nautobot/dcim/tests/test_custom_validators.py +229 -0
  400. nautobot/dcim/tests/test_filters.py +159 -110
  401. nautobot/dcim/tests/test_graphql.py +32 -36
  402. nautobot/dcim/tests/test_jobs.py +1 -1
  403. nautobot/dcim/tests/test_models.py +229 -1
  404. nautobot/dcim/tests/test_views.py +31 -20
  405. nautobot/dcim/utils.py +3 -3
  406. nautobot/dcim/views.py +77 -41
  407. nautobot/extras/api/serializers.py +83 -19
  408. nautobot/extras/api/urls.py +7 -0
  409. nautobot/extras/api/views.py +243 -140
  410. nautobot/extras/choices.py +34 -13
  411. nautobot/extras/constants.py +1 -1
  412. nautobot/extras/context_managers.py +26 -26
  413. nautobot/extras/datasources/git.py +22 -0
  414. nautobot/extras/datasources/registry.py +3 -0
  415. nautobot/extras/exceptions.py +5 -0
  416. nautobot/extras/factory.py +11 -1
  417. nautobot/extras/{filters/mixins.py → filter_mixins.py} +4 -3
  418. nautobot/extras/{filters/__init__.py → filters.py} +203 -58
  419. nautobot/extras/forms/base.py +2 -1
  420. nautobot/extras/forms/forms.py +225 -20
  421. nautobot/extras/forms/mixins.py +0 -41
  422. nautobot/extras/homepage.py +21 -2
  423. nautobot/extras/jobs.py +2 -8
  424. nautobot/extras/jobs_ui.py +2 -2
  425. nautobot/extras/management/__init__.py +9 -0
  426. nautobot/extras/managers.py +31 -22
  427. nautobot/extras/migrations/0126_approval_workflow_pre_check.py +58 -0
  428. nautobot/extras/migrations/0127_approval_workflow_models.py +266 -0
  429. nautobot/extras/migrations/0128_remove_job_approval_required_and_more.py +29 -0
  430. nautobot/extras/migrations/0129_jobresult_debug_log_count_jobresult_error_log_count_and_more.py +37 -0
  431. nautobot/extras/migrations/0130_jobresult_generate_log_entry_counts.py +42 -0
  432. nautobot/extras/models/__init__.py +14 -3
  433. nautobot/extras/models/approvals.py +556 -0
  434. nautobot/extras/models/change_logging.py +1 -0
  435. nautobot/extras/models/contacts.py +2 -0
  436. nautobot/extras/models/customfields.py +57 -22
  437. nautobot/extras/models/datasources.py +21 -0
  438. nautobot/extras/models/groups.py +2 -0
  439. nautobot/extras/models/jobs.py +122 -39
  440. nautobot/extras/models/metadata.py +2 -3
  441. nautobot/extras/models/mixins.py +129 -1
  442. nautobot/extras/models/models.py +22 -14
  443. nautobot/extras/models/relationships.py +47 -10
  444. nautobot/extras/models/secrets.py +1 -0
  445. nautobot/extras/models/statuses.py +0 -15
  446. nautobot/extras/models/tags.py +1 -1
  447. nautobot/extras/navigation.py +42 -15
  448. nautobot/extras/plugins/__init__.py +33 -55
  449. nautobot/extras/plugins/marketplace_manifest.yml +1 -23
  450. nautobot/extras/plugins/tables.py +8 -6
  451. nautobot/extras/plugins/urls.py +2 -21
  452. nautobot/extras/plugins/utils.py +1 -33
  453. nautobot/extras/plugins/validators.py +10 -10
  454. nautobot/extras/plugins/views.py +1 -5
  455. nautobot/extras/querysets.py +17 -21
  456. nautobot/extras/signals.py +23 -8
  457. nautobot/extras/tables.py +420 -99
  458. nautobot/extras/templates/extras/approval_dashboard.html +15 -0
  459. nautobot/extras/templates/extras/approval_workflow/approve.html +11 -0
  460. nautobot/extras/templates/extras/approval_workflow/comment.html +9 -0
  461. nautobot/extras/templates/extras/approval_workflow/deny.html +10 -0
  462. nautobot/extras/templates/extras/approvalworkflowdefinition_update.html +77 -0
  463. nautobot/extras/templates/extras/approvalworkflowstage_retrieve.html +29 -0
  464. nautobot/extras/templates/extras/configcontext_update.html +12 -12
  465. nautobot/extras/templates/extras/configcontextschema.html +1 -1
  466. nautobot/extras/templates/extras/configcontextschema_retrieve.html +9 -9
  467. nautobot/extras/templates/extras/configcontextschema_update.html +6 -6
  468. nautobot/extras/templates/extras/configcontextschema_validation.html +2 -2
  469. nautobot/extras/templates/extras/customfield_update.html +12 -12
  470. nautobot/extras/templates/extras/dynamicgroup.html +1 -1
  471. nautobot/extras/templates/extras/dynamicgroup_edit.html +1 -1
  472. nautobot/extras/templates/extras/dynamicgroup_retrieve.html +17 -17
  473. nautobot/extras/templates/extras/dynamicgroup_update.html +24 -24
  474. nautobot/extras/templates/extras/externalintegration_update.html +6 -6
  475. nautobot/extras/templates/extras/gitrepository.html +1 -1
  476. nautobot/extras/templates/extras/gitrepository_object_edit.html +1 -1
  477. nautobot/extras/templates/extras/gitrepository_result.html +1 -1
  478. nautobot/extras/templates/extras/gitrepository_retrieve.html +12 -12
  479. nautobot/extras/templates/extras/gitrepository_update.html +25 -7
  480. nautobot/extras/templates/extras/graphqlquery_retrieve.html +1 -1
  481. nautobot/extras/templates/extras/inc/approval_buttons_column.html +38 -0
  482. nautobot/extras/templates/extras/inc/bulk_edit_overridable_field.html +14 -13
  483. nautobot/extras/templates/extras/inc/configcontext_format.html +11 -4
  484. nautobot/extras/templates/extras/inc/graphqlquery_execute.html +7 -7
  485. nautobot/extras/templates/extras/inc/job_label.html +5 -5
  486. nautobot/extras/templates/extras/inc/job_table.html +23 -10
  487. nautobot/extras/templates/extras/inc/job_tiles.html +33 -21
  488. nautobot/extras/templates/extras/inc/jobresult.html +6 -6
  489. nautobot/extras/templates/extras/inc/json_format.html +11 -4
  490. nautobot/extras/templates/extras/inc/object_contact_header.html +6 -6
  491. nautobot/extras/templates/extras/inc/overridable_field.html +16 -15
  492. nautobot/extras/templates/extras/inc/panel_approvalworkflowstage.html +34 -0
  493. nautobot/extras/templates/extras/inc/panel_changelog.html +9 -9
  494. nautobot/extras/templates/extras/inc/panel_jobhistory.html +8 -6
  495. nautobot/extras/templates/extras/inc/tags_panel.html +3 -3
  496. nautobot/extras/templates/extras/job.html +154 -155
  497. nautobot/extras/templates/extras/job_approval_confirmation.html +4 -27
  498. nautobot/extras/templates/extras/job_bulk_edit.html +18 -1
  499. nautobot/extras/templates/extras/job_detail.html +1 -1
  500. nautobot/extras/templates/extras/job_edit.html +69 -64
  501. nautobot/extras/templates/extras/job_list.html +37 -60
  502. nautobot/extras/templates/extras/jobresult.html +1 -1
  503. nautobot/extras/templates/extras/jobresult_retrieve.html +17 -17
  504. nautobot/extras/templates/extras/marketplace.html +62 -71
  505. nautobot/extras/templates/extras/metadatatype_create.html +9 -9
  506. nautobot/extras/templates/extras/note.html +1 -1
  507. nautobot/extras/templates/extras/object_approvalworkflow.html +36 -0
  508. nautobot/extras/templates/extras/object_assign_contact_or_team.html +16 -7
  509. nautobot/extras/templates/extras/object_configcontext.html +20 -20
  510. nautobot/extras/templates/extras/object_new_contact.html +6 -6
  511. nautobot/extras/templates/extras/object_new_team.html +6 -6
  512. nautobot/extras/templates/extras/objectchange.html +1 -1
  513. nautobot/extras/templates/extras/objectchange_retrieve.html +37 -56
  514. nautobot/extras/templates/extras/plugin_detail.html +40 -41
  515. nautobot/extras/templates/extras/plugins_list.html +23 -38
  516. nautobot/extras/templates/extras/plugins_tiles.html +28 -28
  517. nautobot/extras/templates/extras/role_retrieve.html +112 -48
  518. nautobot/extras/templates/extras/scheduledjob.html +25 -28
  519. nautobot/extras/templates/extras/secret_create.html +11 -11
  520. nautobot/extras/templates/extras/secretsgroup_update.html +6 -6
  521. nautobot/extras/templates/extras/staticgroupassociation_retrieve.html +3 -3
  522. nautobot/extras/templates/extras/status.html +1 -1
  523. nautobot/extras/templates/extras/tag.html +1 -1
  524. nautobot/extras/templates/extras/tag_update.html +3 -3
  525. nautobot/extras/templates/extras/templatetags/log_level.html +1 -1
  526. nautobot/extras/templates/extras/templatetags/plugin_object_detail_tabs.html +2 -2
  527. nautobot/extras/templates/extras/webhook.html +12 -12
  528. nautobot/extras/templatetags/approvals.py +19 -0
  529. nautobot/extras/templatetags/custom_links.py +12 -12
  530. nautobot/extras/templatetags/job_buttons.py +14 -12
  531. nautobot/extras/test_jobs/invalid_import.py +9 -0
  532. nautobot/extras/test_jobs/log_counts_by_level.py +23 -0
  533. nautobot/extras/test_jobs/missing_import.py +11 -0
  534. nautobot/extras/tests/integration/test_computedfields.py +5 -8
  535. nautobot/extras/tests/integration/test_configcontextschema.py +43 -48
  536. nautobot/extras/tests/integration/test_customfields.py +33 -33
  537. nautobot/extras/tests/integration/test_dynamicgroups.py +5 -10
  538. nautobot/extras/tests/integration/test_jobs.py +2 -4
  539. nautobot/extras/tests/integration/test_notes.py +3 -9
  540. nautobot/extras/tests/integration/test_plugin_banner.py +3 -0
  541. nautobot/extras/tests/integration/test_plugins.py +35 -27
  542. nautobot/extras/tests/integration/test_relationships.py +7 -11
  543. nautobot/extras/tests/integration/test_tagfilter.py +3 -11
  544. nautobot/extras/tests/test_api.py +786 -242
  545. nautobot/extras/tests/test_approvals.py +715 -0
  546. nautobot/extras/tests/test_changelog.py +18 -14
  547. nautobot/extras/tests/test_customfields.py +14 -13
  548. nautobot/extras/tests/test_datasources.py +1 -1
  549. nautobot/extras/tests/test_dynamicgroups.py +9 -4
  550. nautobot/extras/tests/test_filters.py +443 -13
  551. nautobot/extras/tests/test_forms.py +18 -57
  552. nautobot/extras/tests/test_jobs.py +25 -4
  553. nautobot/extras/tests/test_migrations.py +81 -1
  554. nautobot/extras/tests/test_models.py +378 -47
  555. nautobot/extras/tests/test_plugins.py +47 -13
  556. nautobot/extras/tests/test_relationships.py +7 -2
  557. nautobot/extras/tests/test_utils.py +2 -0
  558. nautobot/extras/tests/test_views.py +780 -493
  559. nautobot/extras/urls.py +36 -12
  560. nautobot/extras/utils.py +58 -12
  561. nautobot/extras/views.py +668 -209
  562. nautobot/ipam/factory.py +7 -0
  563. nautobot/ipam/filter_mixins.py +38 -0
  564. nautobot/ipam/filters.py +35 -71
  565. nautobot/ipam/formfields.py +1 -1
  566. nautobot/ipam/forms.py +6 -3
  567. nautobot/ipam/migrations/0030_ipam__namespaces.py +13 -0
  568. nautobot/ipam/migrations/0031_ipam___data_migrations.py +4 -1
  569. nautobot/ipam/migrations/0054_namespace_tenant.py +25 -0
  570. nautobot/ipam/models.py +29 -2
  571. nautobot/ipam/navigation.py +3 -1
  572. nautobot/ipam/querysets.py +1 -2
  573. nautobot/ipam/tables.py +26 -17
  574. nautobot/ipam/templates/ipam/inc/ipadress_edit_header.html +6 -6
  575. nautobot/ipam/templates/ipam/inc/service.html +8 -8
  576. nautobot/ipam/templates/ipam/inc/toggle_available.html +10 -10
  577. nautobot/ipam/templates/ipam/inc/vlangroup_header.html +3 -2
  578. nautobot/ipam/templates/ipam/ipaddress.html +27 -13
  579. nautobot/ipam/templates/ipam/ipaddress_assign.html +31 -24
  580. nautobot/ipam/templates/ipam/ipaddress_bulk_add.html +3 -3
  581. nautobot/ipam/templates/ipam/ipaddress_edit.html +9 -9
  582. nautobot/ipam/templates/ipam/ipaddress_interfaces.html +7 -9
  583. nautobot/ipam/templates/ipam/ipaddress_merge.html +195 -186
  584. nautobot/ipam/templates/ipam/ipaddress_vm_interfaces.html +7 -9
  585. nautobot/ipam/templates/ipam/ipaddresstointerface_retrieve.html +7 -5
  586. nautobot/ipam/templates/ipam/namespace_ip_addresses.html +1 -1
  587. nautobot/ipam/templates/ipam/namespace_prefixes.html +1 -1
  588. nautobot/ipam/templates/ipam/namespace_update.html +15 -0
  589. nautobot/ipam/templates/ipam/namespace_vrfs.html +1 -1
  590. nautobot/ipam/templates/ipam/prefix_create.html +9 -9
  591. nautobot/ipam/templates/ipam/prefix_list.html +15 -14
  592. nautobot/ipam/templates/ipam/prefix_retrieve.html +0 -1
  593. nautobot/ipam/templates/ipam/vlan.html +1 -1
  594. nautobot/ipam/templates/ipam/vlan_interfaces.html +1 -1
  595. nautobot/ipam/templates/ipam/vlan_update.html +6 -6
  596. nautobot/ipam/templates/ipam/vlan_vminterfaces.html +1 -1
  597. nautobot/ipam/templates/ipam/vrf_edit.html +15 -15
  598. nautobot/ipam/tests/integration/test_prefixes.py +5 -13
  599. nautobot/ipam/tests/migration/test_migrations.py +89 -0
  600. nautobot/ipam/tests/test_api.py +20 -7
  601. nautobot/ipam/tests/test_filters.py +10 -0
  602. nautobot/ipam/tests/test_forms.py +1 -1
  603. nautobot/ipam/tests/test_models.py +1 -1
  604. nautobot/ipam/tests/test_tables.py +1 -2
  605. nautobot/ipam/tests/test_utils.py +1 -1
  606. nautobot/ipam/tests/test_views.py +24 -21
  607. nautobot/ipam/ui.py +0 -17
  608. nautobot/ipam/utils/migrations.py +16 -2
  609. nautobot/ipam/utils/testing.py +9 -3
  610. nautobot/ipam/views.py +49 -7
  611. nautobot/project-static/dist/css/graphql-libraries.css +655 -0
  612. nautobot/project-static/dist/css/graphql-libraries.css.map +1 -0
  613. nautobot/project-static/dist/css/materialdesignicons.css +3 -0
  614. nautobot/project-static/dist/css/materialdesignicons.css.map +1 -0
  615. nautobot/project-static/dist/css/nautobot.css +13 -0
  616. nautobot/project-static/dist/css/nautobot.css.map +1 -0
  617. nautobot/project-static/dist/js/graphql-libraries.js +3 -0
  618. nautobot/project-static/dist/js/graphql-libraries.js.LICENSE.txt +62 -0
  619. nautobot/project-static/dist/js/graphql-libraries.js.map +1 -0
  620. nautobot/project-static/dist/js/libraries.js +3 -0
  621. nautobot/project-static/dist/js/libraries.js.LICENSE.txt +65 -0
  622. nautobot/project-static/dist/js/libraries.js.map +1 -0
  623. nautobot/project-static/dist/js/materialdesignicons.js +0 -0
  624. nautobot/project-static/dist/js/nautobot-graphiql.js +2 -0
  625. nautobot/project-static/dist/js/nautobot-graphiql.js.map +1 -0
  626. nautobot/project-static/dist/js/nautobot.js +2 -0
  627. nautobot/project-static/dist/js/nautobot.js.map +1 -0
  628. nautobot/project-static/fonts/Montserrat-v30-Bold.woff2 +0 -0
  629. nautobot/project-static/fonts/Montserrat-v30-Light.woff2 +0 -0
  630. nautobot/project-static/fonts/Montserrat-v30-Regular.woff2 +0 -0
  631. nautobot/project-static/fonts/Roboto-v48-Bold.woff2 +0 -0
  632. nautobot/project-static/fonts/Roboto-v48-Light.woff2 +0 -0
  633. nautobot/project-static/fonts/Roboto-v48-Regular.woff2 +0 -0
  634. nautobot/project-static/img/jinja_logo.svg +21 -92
  635. nautobot/project-static/js/cabletrace.js +1 -1
  636. nautobot/project-static/js/editor.js +4 -4
  637. nautobot/project-static/js/forms.js +67 -717
  638. nautobot/project-static/js/job_result.js +2 -2
  639. nautobot/project-static/nautobot-icons/360-degrees.svg +3 -0
  640. nautobot/project-static/nautobot-icons/arrow-decision.svg +3 -0
  641. nautobot/project-static/nautobot-icons/arrows-expand-rec.svg +3 -0
  642. nautobot/project-static/nautobot-icons/arrows-move-2-rec.svg +3 -0
  643. nautobot/project-static/nautobot-icons/arrows-move-rec.svg +3 -0
  644. nautobot/project-static/nautobot-icons/atom.svg +3 -0
  645. nautobot/project-static/nautobot-icons/battery-3.svg +3 -0
  646. nautobot/project-static/nautobot-icons/branch.svg +3 -0
  647. nautobot/project-static/nautobot-icons/briefcase-2.svg +3 -0
  648. nautobot/project-static/nautobot-icons/cable-data-2.svg +3 -0
  649. nautobot/project-static/nautobot-icons/cable-data.svg +3 -0
  650. nautobot/project-static/nautobot-icons/cast.svg +3 -0
  651. nautobot/project-static/nautobot-icons/check-circle.svg +3 -0
  652. nautobot/project-static/nautobot-icons/checkbox-circle.svg +3 -0
  653. nautobot/project-static/nautobot-icons/checkbox-rec.svg +3 -0
  654. nautobot/project-static/nautobot-icons/cloud-check.svg +3 -0
  655. nautobot/project-static/nautobot-icons/cloud-lightning.svg +3 -0
  656. nautobot/project-static/nautobot-icons/cloud-upload.svg +3 -0
  657. nautobot/project-static/nautobot-icons/cloud.svg +3 -0
  658. nautobot/project-static/nautobot-icons/compass.svg +3 -0
  659. nautobot/project-static/nautobot-icons/control-panel.svg +3 -0
  660. nautobot/project-static/nautobot-icons/credit-card.svg +3 -0
  661. nautobot/project-static/nautobot-icons/device-lifecycle.svg +3 -0
  662. nautobot/project-static/nautobot-icons/direction.svg +3 -0
  663. nautobot/project-static/nautobot-icons/elements.svg +3 -0
  664. nautobot/project-static/nautobot-icons/extensibility.svg +3 -0
  665. nautobot/project-static/nautobot-icons/globe-2.svg +3 -0
  666. nautobot/project-static/nautobot-icons/globe.svg +3 -0
  667. nautobot/project-static/nautobot-icons/hammer.svg +3 -0
  668. nautobot/project-static/nautobot-icons/history.svg +3 -0
  669. nautobot/project-static/nautobot-icons/ip.svg +3 -0
  670. nautobot/project-static/nautobot-icons/laptop.svg +3 -0
  671. nautobot/project-static/nautobot-icons/lightning.svg +3 -0
  672. nautobot/project-static/nautobot-icons/list-unordered.svg +3 -0
  673. nautobot/project-static/nautobot-icons/map-view.svg +3 -0
  674. nautobot/project-static/nautobot-icons/organization.svg +3 -0
  675. nautobot/project-static/nautobot-icons/pin-2.svg +3 -0
  676. nautobot/project-static/nautobot-icons/pin-3.svg +3 -0
  677. nautobot/project-static/nautobot-icons/plug.svg +3 -0
  678. nautobot/project-static/nautobot-icons/refresh-cw.svg +3 -0
  679. nautobot/project-static/nautobot-icons/rocket-2.svg +3 -0
  680. nautobot/project-static/nautobot-icons/rotate-cw.svg +3 -0
  681. nautobot/project-static/nautobot-icons/route.svg +3 -0
  682. nautobot/project-static/nautobot-icons/secrets.svg +3 -0
  683. nautobot/project-static/nautobot-icons/security.svg +3 -0
  684. nautobot/project-static/nautobot-icons/server-2.svg +3 -0
  685. nautobot/project-static/nautobot-icons/server.svg +3 -0
  686. nautobot/project-static/nautobot-icons/share.svg +3 -0
  687. nautobot/project-static/nautobot-icons/shield-check.svg +3 -0
  688. nautobot/project-static/nautobot-icons/sitemap-outline.svg +3 -0
  689. nautobot/project-static/nautobot-icons/sliders-vert-2.svg +3 -0
  690. nautobot/project-static/nautobot-icons/sliders-vert.svg +3 -0
  691. nautobot/project-static/nautobot-icons/star-filled.svg +3 -0
  692. nautobot/project-static/nautobot-icons/star.svg +3 -0
  693. nautobot/project-static/nautobot-icons/transform.svg +3 -0
  694. nautobot/project-static/nautobot-icons/wifi.svg +3 -0
  695. nautobot/tenancy/api/serializers.py +1 -0
  696. nautobot/tenancy/api/views.py +2 -1
  697. nautobot/tenancy/{filters/__init__.py → filters.py} +2 -10
  698. nautobot/tenancy/navigation.py +3 -1
  699. nautobot/tenancy/templates/tenancy/tenant_create.html +6 -6
  700. nautobot/tenancy/tests/test_filters.py +0 -2
  701. nautobot/tenancy/views.py +2 -1
  702. nautobot/ui/.gitignore +137 -0
  703. nautobot/ui/.node-version +1 -0
  704. nautobot/ui/.prettierignore +3 -0
  705. nautobot/ui/eslint.config.js +33 -0
  706. nautobot/ui/package-lock.json +6594 -0
  707. nautobot/ui/package.json +67 -0
  708. nautobot/ui/prettier.config.js +9 -0
  709. nautobot/ui/src/js/collapse.js +69 -0
  710. nautobot/ui/src/js/cookie.js +31 -0
  711. nautobot/ui/src/js/draggable.js +101 -0
  712. nautobot/ui/src/js/drawer.js +106 -0
  713. nautobot/ui/src/js/form.js +23 -0
  714. nautobot/ui/src/js/history.js +51 -0
  715. nautobot/ui/src/js/nautobot-graphiql.js +19 -0
  716. nautobot/ui/src/js/nautobot.js +128 -0
  717. nautobot/ui/src/js/search.js +274 -0
  718. nautobot/ui/src/js/select2.js +318 -0
  719. nautobot/ui/src/js/sidenav.js +87 -0
  720. nautobot/ui/src/js/tabs.js +139 -0
  721. nautobot/ui/src/js/theme.js +104 -0
  722. nautobot/ui/src/js/utils.js +54 -0
  723. nautobot/ui/src/scss/colors.scss +58 -0
  724. nautobot/ui/src/scss/nautobot.scss +2471 -0
  725. nautobot/ui/webpack.config.js +148 -0
  726. nautobot/users/apps.py +3 -0
  727. nautobot/users/filters.py +7 -11
  728. nautobot/users/forms.py +10 -0
  729. nautobot/users/models.py +8 -0
  730. nautobot/users/templates/users/advanced_settings_edit.html +31 -21
  731. nautobot/users/templates/users/api_tokens.html +61 -51
  732. nautobot/users/templates/users/base.html +23 -31
  733. nautobot/users/templates/users/change_password.html +29 -19
  734. nautobot/users/templates/users/preferences.html +55 -45
  735. nautobot/users/templates/users/profile.html +45 -14
  736. nautobot/users/tests/test_api.py +4 -0
  737. nautobot/users/urls.py +2 -0
  738. nautobot/users/views.py +70 -2
  739. nautobot/virtualization/api/views.py +1 -1
  740. nautobot/virtualization/filters.py +18 -32
  741. nautobot/virtualization/forms.py +22 -59
  742. nautobot/virtualization/models.py +1 -19
  743. nautobot/virtualization/navigation.py +3 -1
  744. nautobot/virtualization/tables.py +10 -6
  745. nautobot/virtualization/templates/virtualization/cluster.html +13 -13
  746. nautobot/virtualization/templates/virtualization/cluster_edit.html +6 -6
  747. nautobot/virtualization/templates/virtualization/inc/virtualmachine_vminterface_filter.html +1 -1
  748. nautobot/virtualization/templates/virtualization/virtualmachine.html +1 -1
  749. nautobot/virtualization/templates/virtualization/virtualmachine_component_add.html +24 -16
  750. nautobot/virtualization/templates/virtualization/virtualmachine_edit.html +1 -1
  751. nautobot/virtualization/templates/virtualization/virtualmachine_list.html +4 -4
  752. nautobot/virtualization/templates/virtualization/virtualmachine_update.html +27 -25
  753. nautobot/virtualization/templates/virtualization/vminterface.html +5 -5
  754. nautobot/virtualization/templates/virtualization/vminterface_edit.html +27 -11
  755. nautobot/virtualization/tests/test_api.py +3 -0
  756. nautobot/virtualization/tests/test_models.py +20 -5
  757. nautobot/virtualization/tests/test_views.py +3 -5
  758. nautobot/virtualization/urls.py +0 -11
  759. nautobot/virtualization/views.py +5 -122
  760. nautobot/vpn/__init__.py +0 -0
  761. nautobot/vpn/api/serializers.py +113 -0
  762. nautobot/vpn/api/urls.py +19 -0
  763. nautobot/vpn/api/views.py +70 -0
  764. nautobot/vpn/apps.py +8 -0
  765. nautobot/vpn/choices.py +171 -0
  766. nautobot/vpn/factory.py +209 -0
  767. nautobot/vpn/filters.py +233 -0
  768. nautobot/vpn/forms.py +486 -0
  769. nautobot/vpn/homepage.py +19 -0
  770. nautobot/vpn/migrations/0001_initial.py +541 -0
  771. nautobot/vpn/migrations/0002_populate_defaults.py +199 -0
  772. nautobot/vpn/migrations/__init__.py +0 -0
  773. nautobot/vpn/models.py +527 -0
  774. nautobot/vpn/navigation.py +98 -0
  775. nautobot/vpn/tables.py +380 -0
  776. nautobot/vpn/templates/vpn/vpnprofile.html +2 -0
  777. nautobot/vpn/templates/vpn/vpnprofile_create.html +150 -0
  778. nautobot/vpn/tests/__init__.py +0 -0
  779. nautobot/vpn/tests/test_api.py +341 -0
  780. nautobot/vpn/tests/test_filters.py +139 -0
  781. nautobot/vpn/tests/test_forms.py +294 -0
  782. nautobot/vpn/tests/test_models.py +97 -0
  783. nautobot/vpn/tests/test_views.py +281 -0
  784. nautobot/vpn/urls.py +16 -0
  785. nautobot/vpn/views.py +437 -0
  786. nautobot/wireless/filters.py +0 -8
  787. nautobot/wireless/navigation.py +3 -1
  788. nautobot/wireless/templates/wireless/wirelessnetwork_create.html +6 -6
  789. nautobot/wireless/tests/integration/test_radio_profile.py +3 -7
  790. nautobot/wireless/tests/test_api.py +1 -1
  791. {nautobot-2.4.21.dist-info → nautobot-3.0.0a3.dist-info}/METADATA +5 -4
  792. {nautobot-2.4.21.dist-info → nautobot-3.0.0a3.dist-info}/RECORD +802 -707
  793. {nautobot-2.4.21.dist-info → nautobot-3.0.0a3.dist-info}/entry_points.txt +1 -0
  794. nautobot/core/management/commands/check_job_approval_status.py +0 -47
  795. nautobot/core/templates/search_form.html +0 -9
  796. nautobot/core/templates/utilities/templatetags/filter_form_modal.html +0 -87
  797. nautobot/dcim/filters/mixins.py +0 -354
  798. nautobot/extras/templates/extras/job_approval_request.html +0 -134
  799. nautobot/extras/templates/extras/scheduled_jobs_approval_queue_list.html +0 -28
  800. nautobot/ipam/mixins.py +0 -32
  801. nautobot/ipam/templates/ipam/inc/prefix_header_extra_content_table.html +0 -4
  802. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.css +0 -587
  803. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.css.map +0 -1
  804. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css +0 -6
  805. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css.map +0 -1
  806. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css +0 -6865
  807. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.css.map +0 -1
  808. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css +0 -6
  809. nautobot/project-static/bootstrap-3.4.1-dist/css/bootstrap.min.css.map +0 -1
  810. nautobot/project-static/bootstrap-3.4.1-dist/fonts/glyphicons-halflings-regular.eot +0 -0
  811. nautobot/project-static/bootstrap-3.4.1-dist/fonts/glyphicons-halflings-regular.svg +0 -288
  812. nautobot/project-static/bootstrap-3.4.1-dist/fonts/glyphicons-halflings-regular.ttf +0 -0
  813. nautobot/project-static/bootstrap-3.4.1-dist/fonts/glyphicons-halflings-regular.woff +0 -0
  814. nautobot/project-static/bootstrap-3.4.1-dist/fonts/glyphicons-halflings-regular.woff2 +0 -0
  815. nautobot/project-static/bootstrap-3.4.1-dist/js/bootstrap.js +0 -2580
  816. nautobot/project-static/bootstrap-3.4.1-dist/js/bootstrap.min.js +0 -6
  817. nautobot/project-static/bootstrap-3.4.1-dist/js/npm.js +0 -13
  818. nautobot/project-static/clipboard.js-2.0.9/clipboard.min.js +0 -7
  819. nautobot/project-static/css/base.css +0 -1040
  820. nautobot/project-static/css/dark.css +0 -282
  821. nautobot/project-static/flatpickr-4.6.9/flatpickr.min.js +0 -2
  822. nautobot/project-static/flatpickr-4.6.9/themes/light.min.css +0 -1
  823. nautobot/project-static/graphiql-1.5.16/graphiql.min.css +0 -12
  824. nautobot/project-static/graphiql-1.5.16/graphiql.min.js +0 -11
  825. nautobot/project-static/highlight.js-11.9.0/github-dark.min.css +0 -10
  826. nautobot/project-static/highlight.js-11.9.0/github.min.css +0 -10
  827. nautobot/project-static/highlight.js-11.9.0/highlight.min.js +0 -378
  828. nautobot/project-static/jquery/jquery-3.7.1.min.js +0 -2
  829. nautobot/project-static/jquery-ui-1.13.2/images/ui-icons_444444_256x240.png +0 -0
  830. nautobot/project-static/jquery-ui-1.13.2/images/ui-icons_555555_256x240.png +0 -0
  831. nautobot/project-static/jquery-ui-1.13.2/images/ui-icons_777620_256x240.png +0 -0
  832. nautobot/project-static/jquery-ui-1.13.2/images/ui-icons_777777_256x240.png +0 -0
  833. nautobot/project-static/jquery-ui-1.13.2/images/ui-icons_cc0000_256x240.png +0 -0
  834. nautobot/project-static/jquery-ui-1.13.2/images/ui-icons_ffffff_256x240.png +0 -0
  835. nautobot/project-static/jquery-ui-1.13.2/jquery-ui.min.css +0 -7
  836. nautobot/project-static/jquery-ui-1.13.2/jquery-ui.min.js +0 -6
  837. nautobot/project-static/jquery-ui-1.13.2/jquery-ui.structure.min.css +0 -5
  838. nautobot/project-static/jquery-ui-1.13.2/jquery-ui.theme.min.css +0 -5
  839. nautobot/project-static/js/homepage_layout.js +0 -182
  840. nautobot/project-static/js/nav_menu.js +0 -250
  841. nautobot/project-static/js/theme.js +0 -133
  842. nautobot/project-static/materialdesignicons-7.4.47/LICENSE +0 -20
  843. nautobot/project-static/materialdesignicons-7.4.47/css/materialdesignicons.min.css +0 -3
  844. nautobot/project-static/react-16.14.0/react.production.min.js +0 -32
  845. nautobot/project-static/react-dom-16.14.0/react-dom.production.min.js +0 -239
  846. nautobot/project-static/select2-4.0.13/i18n/af.js +0 -3
  847. nautobot/project-static/select2-4.0.13/i18n/ar.js +0 -3
  848. nautobot/project-static/select2-4.0.13/i18n/az.js +0 -3
  849. nautobot/project-static/select2-4.0.13/i18n/bg.js +0 -3
  850. nautobot/project-static/select2-4.0.13/i18n/bn.js +0 -3
  851. nautobot/project-static/select2-4.0.13/i18n/bs.js +0 -3
  852. nautobot/project-static/select2-4.0.13/i18n/ca.js +0 -3
  853. nautobot/project-static/select2-4.0.13/i18n/cs.js +0 -3
  854. nautobot/project-static/select2-4.0.13/i18n/da.js +0 -3
  855. nautobot/project-static/select2-4.0.13/i18n/de.js +0 -3
  856. nautobot/project-static/select2-4.0.13/i18n/dsb.js +0 -3
  857. nautobot/project-static/select2-4.0.13/i18n/el.js +0 -3
  858. nautobot/project-static/select2-4.0.13/i18n/en.js +0 -3
  859. nautobot/project-static/select2-4.0.13/i18n/es.js +0 -3
  860. nautobot/project-static/select2-4.0.13/i18n/et.js +0 -3
  861. nautobot/project-static/select2-4.0.13/i18n/eu.js +0 -3
  862. nautobot/project-static/select2-4.0.13/i18n/fa.js +0 -3
  863. nautobot/project-static/select2-4.0.13/i18n/fi.js +0 -3
  864. nautobot/project-static/select2-4.0.13/i18n/fr.js +0 -3
  865. nautobot/project-static/select2-4.0.13/i18n/gl.js +0 -3
  866. nautobot/project-static/select2-4.0.13/i18n/he.js +0 -3
  867. nautobot/project-static/select2-4.0.13/i18n/hi.js +0 -3
  868. nautobot/project-static/select2-4.0.13/i18n/hr.js +0 -3
  869. nautobot/project-static/select2-4.0.13/i18n/hsb.js +0 -3
  870. nautobot/project-static/select2-4.0.13/i18n/hu.js +0 -3
  871. nautobot/project-static/select2-4.0.13/i18n/hy.js +0 -3
  872. nautobot/project-static/select2-4.0.13/i18n/id.js +0 -3
  873. nautobot/project-static/select2-4.0.13/i18n/is.js +0 -3
  874. nautobot/project-static/select2-4.0.13/i18n/it.js +0 -3
  875. nautobot/project-static/select2-4.0.13/i18n/ja.js +0 -3
  876. nautobot/project-static/select2-4.0.13/i18n/ka.js +0 -3
  877. nautobot/project-static/select2-4.0.13/i18n/km.js +0 -3
  878. nautobot/project-static/select2-4.0.13/i18n/ko.js +0 -3
  879. nautobot/project-static/select2-4.0.13/i18n/lt.js +0 -3
  880. nautobot/project-static/select2-4.0.13/i18n/lv.js +0 -3
  881. nautobot/project-static/select2-4.0.13/i18n/mk.js +0 -3
  882. nautobot/project-static/select2-4.0.13/i18n/ms.js +0 -3
  883. nautobot/project-static/select2-4.0.13/i18n/nb.js +0 -3
  884. nautobot/project-static/select2-4.0.13/i18n/ne.js +0 -3
  885. nautobot/project-static/select2-4.0.13/i18n/nl.js +0 -3
  886. nautobot/project-static/select2-4.0.13/i18n/pl.js +0 -3
  887. nautobot/project-static/select2-4.0.13/i18n/ps.js +0 -3
  888. nautobot/project-static/select2-4.0.13/i18n/pt-BR.js +0 -3
  889. nautobot/project-static/select2-4.0.13/i18n/pt.js +0 -3
  890. nautobot/project-static/select2-4.0.13/i18n/ro.js +0 -3
  891. nautobot/project-static/select2-4.0.13/i18n/ru.js +0 -3
  892. nautobot/project-static/select2-4.0.13/i18n/sk.js +0 -3
  893. nautobot/project-static/select2-4.0.13/i18n/sl.js +0 -3
  894. nautobot/project-static/select2-4.0.13/i18n/sq.js +0 -3
  895. nautobot/project-static/select2-4.0.13/i18n/sr-Cyrl.js +0 -3
  896. nautobot/project-static/select2-4.0.13/i18n/sr.js +0 -3
  897. nautobot/project-static/select2-4.0.13/i18n/sv.js +0 -3
  898. nautobot/project-static/select2-4.0.13/i18n/th.js +0 -3
  899. nautobot/project-static/select2-4.0.13/i18n/tk.js +0 -3
  900. nautobot/project-static/select2-4.0.13/i18n/tr.js +0 -3
  901. nautobot/project-static/select2-4.0.13/i18n/uk.js +0 -3
  902. nautobot/project-static/select2-4.0.13/i18n/vi.js +0 -3
  903. nautobot/project-static/select2-4.0.13/i18n/zh-CN.js +0 -3
  904. nautobot/project-static/select2-4.0.13/i18n/zh-TW.js +0 -3
  905. nautobot/project-static/select2-4.0.13/select2.min.css +0 -1
  906. nautobot/project-static/select2-4.0.13/select2.min.js +0 -2
  907. nautobot/project-static/select2-bootstrap-0.1.0-beta.10/select2-bootstrap.min.css +0 -7
  908. nautobot/project-static/subscriptions-transport-ws-0.9.18/client.min.js +0 -8
  909. nautobot/project-static/whatwg-fetch-3.6.2/fetch.umd.min.js +0 -8
  910. nautobot/virtualization/templates/virtualization/cluster_add_devices.html +0 -37
  911. /nautobot/extras/{filters/customfields.py → filter_mixins_customfields.py} +0 -0
  912. /nautobot/project-static/{materialdesignicons-7.4.47/fonts/materialdesignicons-webfont.ttf → dist/1fcc36272ea3e53d0031.ttf} +0 -0
  913. /nautobot/project-static/{materialdesignicons-7.4.47/fonts/materialdesignicons-webfont.eot → dist/2146c3c82b553977abc7.eot} +0 -0
  914. /nautobot/project-static/{materialdesignicons-7.4.47/fonts/materialdesignicons-webfont.woff → dist/e55a20c80650829ec5fd.woff} +0 -0
  915. /nautobot/project-static/{materialdesignicons-7.4.47/fonts/materialdesignicons-webfont.woff2 → dist/ec024da790d2972da002.woff2} +0 -0
  916. /nautobot/tenancy/{filters/mixins.py → filter_mixins.py} +0 -0
  917. {nautobot-2.4.21.dist-info → nautobot-3.0.0a3.dist-info}/LICENSE.txt +0 -0
  918. {nautobot-2.4.21.dist-info → nautobot-3.0.0a3.dist-info}/NOTICE +0 -0
  919. {nautobot-2.4.21.dist-info → nautobot-3.0.0a3.dist-info}/WHEEL +0 -0
@@ -1,163 +1,177 @@
1
1
  {% extends 'base.html' %}
2
2
  {% load buttons %}
3
3
  {% load helpers %}
4
+ {% load static %}
5
+ {% load ui_framework %}
4
6
 
5
- {% block header %}
6
- <div class="row noprint">
7
- <div class="col-md-12">
8
- <ol class="breadcrumb">
9
- <li><a href="{% url 'home' %}">Nautobot</a></li>
10
- <li><a href="{% url 'theme_preview' %}">Theme Preview</a></li>
11
- </ol>
12
- </div>
13
- </div>
7
+ {% block breadcrumbs_wrapper %}{% render_breadcrumbs %}{% endblock %}
14
8
 
15
- <h1>{% block title %}Nautobot Theme Preview{% endblock %}</h1>
16
- <hr>
9
+ {% block extra_styles %}
10
+ <style>
11
+ .icon-preview {
12
+ align-items: center;
13
+ display: flex;
14
+ color: #ffffff;
15
+ flex: none;
16
+ flex-direction: column;
17
+ gap: 0.25rem;
18
+ text-align: center;
19
+ width: 5rem;
20
+ }
21
+
22
+ .icon-preview img {
23
+ height: 1.5rem;
24
+ width: 1.5rem;
25
+ }
26
+ </style>
17
27
  {% endblock %}
18
28
 
19
29
  {% block content %}
20
30
  <!-- Begin example of "object_list.html" -->
21
- <div class="row noprint">
22
- <div class="col-sm-8 col-md-9">
23
- <ol class="breadcrumb">
24
- <li><a>Statuses</a></li>
25
- </ol>
26
- </div>
27
- <div class="col-sm-4 col-md-3">
28
- <form>
29
- <div class="input-group">
30
- <input type="text" name="q" class="form-control" placeholder="Search Statuses">
31
- <span class="input-group-btn">
32
- <button type="submit" class="btn btn-primary">
33
- <span class="mdi mdi-magnify"></span>
34
- </button>
35
- </span>
36
- </div>
37
- </form>
38
- </div>
31
+ <div>
32
+ <h1 class="align-items-center d-flex fs-2 gap-8 lh-sm py-6">
33
+ <img
34
+ alt="Nautobot chevron"
35
+ class="flex-grow-0 flex-shrink-0 my-n6"
36
+ role="presentation"
37
+ src="{% static 'img/nautobot_chevron.svg' %}"
38
+ style="width: 1.5rem;"
39
+ />
40
+ Object Listing
41
+ </h1>
42
+ <ol class="breadcrumb">
43
+ <li class="breadcrumb-item"><a>Statuses</a></li>
44
+ </ol>
39
45
  </div>
40
-
41
- <div class="pull-right noprint">
42
- <button type="button" class="btn btn-default"><i class="mdi mdi-cog"></i> Configure</button>
43
- <button type="button" class="btn btn-default"><i class="mdi mdi-filter"></i> Filter</button>
46
+ <div class="align-items-center d-flex gap-8 justify-content-end mb-16 d-print-none">
44
47
  <div class="btn-group">
45
48
  {% add_button content_type.model_class|validated_viewname:"add" %}
46
- <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
47
- <span class="caret"></span>
48
- <span class="sr-only">Toggle Dropdown</span>
49
+ <button type="button" class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
50
+ <span class="visually-hidden">Toggle Dropdown</span>
51
+ <span class="mdi mdi-chevron-down"></span>
49
52
  </button>
50
- <ul class="dropdown-menu pull-right" role="menu">
53
+ <ul class="dropdown-menu dropdown-menu-end" role="menu">
51
54
  {% job_import_button content_type list_element=True%}
52
- <li class="divider"></li>
55
+ <li><hr class="dropdown-divider"></li>
53
56
  {% export_button content_type list_element=True %}
54
57
  </ul>
55
58
  </div>
56
- <div class="btn-group">
57
- <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
58
- Actions <span class="caret"></span>
59
+ <div class="dropdown d-inline-flex">
60
+ <button type="button" class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-expanded="false">
61
+ Actions
59
62
  </button>
60
- <ul class="dropdown-menu pull-right" role="menu">
63
+ <ul class="dropdown-menu dropdown-menu-end" role="menu">
61
64
  {% job_import_button content_type list_element=True%}
62
- <li class="divider"></li>
65
+ <li><hr class="dropdown-divider"></li>
63
66
  {% export_button content_type list_element=True %}
64
67
  </ul>
65
68
  </div>
69
+ <div class="align-items-center d-flex gap-4">
70
+ <button type="button" class="btn position-relative text-secondary" title="Saved Views" aria-expanded="false">
71
+ <span class="mdi mdi-view-compact-outline" aria-hidden="true"></span>
72
+ <span class="visually-hidden">Saved Views</span>
73
+ </button>
74
+ <button type="button" class="btn position-relative text-secondary" title="Add Filters">
75
+ <span class="mdi mdi-filter" aria-hidden="true"></span>
76
+ <span class="visually-hidden">Add Filters</span>
77
+ </button>
78
+ </div>
66
79
  </div>
67
- <h1>Object Listing</h1>
68
80
  <div class="row">
69
81
  <div class="col-md-12">
70
82
  <form>
71
83
  {% include "panel_table.html" %}
72
- <div class="pull-left noprint">
84
+ <div class="d-print-none mt-16 float-lg-start mt-lg-20">
73
85
  <button type="submit" name="_edit" class="btn btn-warning btn-sm">
74
- <span class="mdi mdi-pencil"></span> Edit Selected
86
+ <span class="mdi mdi-pencil me-4"></span>Edit Selected
75
87
  </button>
76
88
  <button type="submit" name="_delete" class="btn btn-danger btn-sm">
77
- <span class="mdi mdi-trash-can-outline"></span> Delete Selected
89
+ <span class="mdi mdi-trash-can-outline me-4"></span>Delete Selected
78
90
  </button>
79
91
  </div>
80
92
  </form>
81
93
  <!-- Begin nested example of "inc/paginator.html" -->
82
- <div class="paginator text-right">
83
- <nav>
84
- <ul class="pagination pull-right">
85
- <li><a><i class="mdi mdi-chevron-double-left"></i></a></li>
86
- <li><a>1</a></li>
87
- <li><a>2</a></li>
88
- <li class="active"><a>3</a></li>
89
- <li><a>4</a></li>
90
- <li><a>5</a></li>
91
- <li class="disabled"><span>&hellip;</span></li>
92
- <li><a>10</a></li>
93
- <li><a><i class="mdi mdi-chevron-double-right"></i></a></li>
94
- </ul>
95
- </nav>
96
- <form class="form-inline">
97
- <select name="per_page" id="per_page" class="form-control">
94
+ <div class="paginator align-items-center d-flex fs-5 gap-10 justify-content-end mt-16 text-secondary">
95
+ <div>
96
+ Showing 50-75 of 250
97
+ </div>
98
+ <div class="vr border-start my-8"></div>
99
+ <form class="align-items-center d-flex gap-4" method="get">
100
+ <select name="per_page" id="per_page" class="form-select">
98
101
  <option value="25" selected="selected">25</option>
99
102
  <option value="50">50</option>
100
103
  <option value="100">100</option>
101
- </select> per page
104
+ </select>
105
+ per page
102
106
  </form>
103
- <div class="text-right text-muted">
104
- Showing 50-75 of 250
105
- </div>
107
+ <div class="vr border-start my-8"></div>
108
+ <nav>
109
+ <ul class="pagination mb-0">
110
+ <li class="page-item"><a class="page-link" href="#" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>
111
+ <li class="page-item"><a class="page-link" href="#">1</a></li>
112
+ <li class="page-item"><a class="page-link" href="#">2</a></li>
113
+ <li class="page-item active"><a class="page-link" href="#">3</a></li>
114
+ <li class="page-item"><a class="page-link" href="#">4</a></li>
115
+ <li class="page-item"><a class="page-link" href="#">5</a></li>
116
+ <li class="page-item disabled"><a class="page-link" tabindex="-1">&hellip;</a></li>
117
+ <li class="page-item"><a class="page-link" href="#">10</a></li>
118
+ <li class="page-item"><a class="page-link" href="#" aria-label="Next"><span aria-hidden="true">&raquo;</span></a></li>
119
+ </ul>
120
+ </nav>
106
121
  </div>
107
122
  <!-- End nested example of "inc/paginator.html" -->
108
- <div class="clearfix"></div>
109
123
  </div>
110
124
  </div>
111
125
  <!-- End example of "object_list.html" -->
112
- <hr>
126
+ <hr class="border-top">
113
127
 
114
128
  <!-- Begin example of "object_retrieve.html" -->
115
- <div class="row">
116
- <div class="col-sm-8 col-md-9">
117
- <ol class="breadcrumb">
118
- <li><a>Statuses</a></li>
119
- <li>{{ object|hyperlinked_object }}</li>
120
- </ol>
121
- </div>
122
- <div class="col-sm-4 col-md-3">
123
- <form>
124
- <div class="input-group">
125
- <input type="text" name="q" class="form-control" placeholder="Search Statuses">
126
- <span class="input-group-btn">
127
- <button type="submit" class="btn btn-primary">
128
- <span class="mdi mdi-magnify"></span>
129
- </button>
130
- </span>
131
- </div>
132
- </form>
133
- </div>
129
+ <div>
130
+ <h1 class="align-items-center d-flex fs-2 gap-8 lh-sm py-6">
131
+ <img
132
+ alt="Nautobot chevron"
133
+ class="flex-grow-0 flex-shrink-0 my-n6"
134
+ role="presentation"
135
+ src="{% static 'img/nautobot_chevron.svg' %}"
136
+ style="width: 1.5rem;"
137
+ />
138
+ <span class="d-flex gap-4">
139
+ <span>Object Detail</span>
140
+ <button type="button" class="btn btn-secondary nb-btn-inline-hover" data-clipboard-text="Object Detail">
141
+ <span aria-hidden="true" class="mdi mdi-content-copy"></span>
142
+ <span class="visually-hidden">Copy</span>
143
+ </button>
144
+ </span>
145
+ </h1>
146
+ <ol class="breadcrumb">
147
+ <li class="breadcrumb-item"><a href="#">Statuses</a></li>
148
+ <li class="breadcrumb-item active" aria-current="page">{{ object|hyperlinked_object }}</li>
149
+ </ol>
134
150
  </div>
135
-
136
- <div class="pull-right noprint">
137
- {% consolidate_detail_view_action_buttons %}
138
- </div>
139
- <h1>
140
- <span class="hover_copy">
141
- Object Detail
142
- <button type="button" class="btn btn-inline btn-default hover_copy_button">
143
- <span class="mdi mdi-content-copy"></span>
144
- </button>
145
- </span>
146
- </h1>
147
- {% include 'inc/created_updated.html' %}
148
- <ul class="nav nav-tabs">
149
- <li role="presentation" class="active"><a>Object</a></li>
150
- <li role="presentation"><a>Advanced</a></li>
151
- <li role="presentation"><a>Notes</a></li>
152
- <li role="presentation"><a>Change Log</a></li>
151
+ <ul class="nav nav-tabs mb-16 mt-12">
152
+ <li role="presentation" class="nav-item"><a class="nav-link active">Object</a></li>
153
+ <li role="presentation" class="nav-item"><a class="nav-link">Advanced</a></li>
154
+ <li role="presentation" class="nav-item"><a class="nav-link">Notes</a></li>
155
+ <li role="presentation" class="nav-item"><a class="nav-link">Change Log</a></li>
153
156
  </ul>
154
157
  <div class="tab-content">
155
158
  <div role="tabpanel" class="tab-pane active">
159
+ <div class="align-items-center d-flex flex-wrap mb-16">
160
+ {% include 'inc/created_updated.html' %}
161
+ <div class="flex-grow-0 flex-shrink-0 d-print-none">
162
+ {% consolidate_detail_view_action_buttons %}
163
+ </div>
164
+ </div>
156
165
  <div class="row">
157
166
  <div class="col-md-6">
158
- <div class="panel panel-default">
159
- <div class="panel-heading"><strong>Status</strong></div>
160
- <table class="table table-hover panel-body attr-table">
167
+ <div class="card">
168
+ <div class="card-header">
169
+ <strong>Status</strong>
170
+ <a class="btn stretched-link nb-collapse-toggle" role="button" aria-expanded="true">
171
+ <span class="mdi mdi-chevron-down"></span>
172
+ </a>
173
+ </div>
174
+ <table class="table table-hover attr-table">
161
175
  <tr>
162
176
  <td>Name</td>
163
177
  <td>{{ object.name }}</td>
@@ -166,9 +180,14 @@
166
180
  </div>
167
181
  </div>
168
182
  <div class="col-md-6">
169
- <div class="panel panel-default">
170
- <div class="panel-heading"><strong>Right Side</strong></div>
171
- <table class="table table-hover panel-body attr-table">
183
+ <div class="card">
184
+ <div class="card-header">
185
+ <strong>Right Side</strong>
186
+ <a class="btn stretched-link nb-collapse-toggle" role="button" aria-expanded="true">
187
+ <span class="mdi mdi-chevron-down"></span>
188
+ </a>
189
+ </div>
190
+ <table class="table table-hover attr-table">
172
191
  <tr>
173
192
  <td>Property</td>
174
193
  <td>Value</td>
@@ -180,227 +199,371 @@
180
199
  </div>
181
200
  </div>
182
201
  <!-- End example of "object_retrieve.html" -->
183
- <hr>
202
+ <hr class="border-top">
184
203
 
185
204
  <!-- Begin example of "object_create.html" -->
186
- <form class="form form-horizontal">
187
- <div class="row">
188
- <div class="col-md-6 col-md-offset-3">
205
+ <div>
206
+ <h1 class="align-items-center d-flex fs-2 gap-8 lh-sm py-6">
207
+ <img
208
+ alt="Nautobot chevron"
209
+ class="flex-grow-0 flex-shrink-0 my-n6"
210
+ role="presentation"
211
+ src="{% static 'img/nautobot_chevron.svg' %}"
212
+ style="width: 1.5rem;"
213
+ />
214
+ Add a new object
215
+ </h1>
216
+ </div>
217
+ <form class="vstack">
218
+ <div class="row align-content-start flex-fill">
219
+ <div class="col-lg-8 offset-lg-2 col-md-10 offset-md-1">
189
220
  <h3>
190
- <div class="pull-right">
191
- <a class="btn btn-link btn-xs"><i class="mdi mdi-help-circle"></i></a>
192
- </div>
193
- Add a new object
221
+ <a class="btn btn-link btn-sm float-end" title="Help">
222
+ <span aria-hidden="true" class="mdi mdi-help-circle"></span>
223
+ </a>
194
224
  </h3>
195
- <div class="panel panel-default">
196
- <div class="panel-heading"><strong>Object</strong></div>
197
- <div class="panel-body">
198
- <div class="form-group">
199
- <label class="col-md-3 control-label" for="id_name">Name</label>
225
+ <div class="card">
226
+ <div class="card-header"><strong>Object</strong></div>
227
+ <div class="card-body">
228
+ <div class="mb-10 d-flex justify-content-center">
229
+ <label class="col-md-3 col-form-label" for="id_name">Name</label>
200
230
  <div class="col-md-9">
201
231
  <input type="text" name="name" class="form-control" placeholder="Name" id="id_name">
202
232
  </div>
203
233
  </div>
204
- <div class="form-group">
205
- <label class="col-md-3 control-label required" for="id_status">Status</label>
234
+ <div class="mb-10 d-flex justify-content-center">
235
+ <label class="col-md-3 col-form-label nb-required" for="id_status">
236
+ Status
237
+ </label>
206
238
  <div class="col-md-9">
207
239
  <select name="status" class="nautobot-select2-api form-control select2-hidden-accessible" data-query-param-content_types="[&quot;dcim.device&quot;]" display-field="display" value-field="id" data-depth="0" required="" placeholder="Status" data-url="/api/extras/statuses/" id="id_status">
208
240
  </select>
209
- <span class="help-block">Help text for this form field</span>
241
+ <span class="form-text">Help text for this form field</span>
210
242
  </div>
211
243
  </div>
212
244
  </div>
213
245
  </div>
214
246
  </div>
215
247
  </div>
216
- <div class="row">
217
- <div class="col-md-6 col-md-offset-3 text-right">
218
- <button type="submit" class="btn btn-primary">Create</button>
219
- <button type="submit" class="btn btn-primary">Create and Add Another</button>
220
- <a class="btn btn-default">Cancel</a>
221
- </div>
248
+ <div class="nb-form-sticky-footer">
249
+ <button type="submit" class="btn btn-primary">Create</button>
250
+ <button type="submit" class="btn btn-primary">Create and Add Another</button>
251
+ <a class="btn btn-secondary">Cancel</a>
222
252
  </div>
223
253
  </form>
224
254
  <!-- End example of "object_create.html" -->
225
- <hr>
255
+ <hr class="border-top">
226
256
 
227
- <div class="row">
228
- <div class="col-md-12">
229
- <!-- Begin example of home page panel -->
230
- <div class="homepage_column" style="columns: 4 360px">
231
- <div class="panel panel-default" style="break-inside: avoid">
232
- <div class="panel-heading">
233
- <strong>Home Page Panel</strong>
234
- </div>
235
- <div class="list-group">
236
- <div class="list-group-item">
237
- <span class="badge pull-right">123</span>
238
- <h4 class="list-group-item-heading">
239
- <a>Locations</a>
240
- </h4>
241
- <p class="list-group-item-text text-muted">Hierarchical geographic locations</p>
242
- </div>
243
- <div class="list-group-item">
244
- <span class="badge pull-right"><i class="mdi mdi-lock"></i></span>
245
- <h4 class="list-group-item-heading">Tenants</h4>
246
- <p class="list-group-item-text text-muted">Customers or departments</p>
247
- </div>
248
- </div>
257
+ <!-- Begin example of form controls -->
258
+ <h1>Forms</h1>
259
+ <form class="row">
260
+ <div class="col-md-4">
261
+ <fieldset class="mb-16">
262
+ <legend>Textboxes</legend>
263
+ <div class="nb-form-group">
264
+ <label class="form-label" for="example-form-control-name">Name</label>
265
+ <input class="form-control" id="example-form-control-name" name="name" placeholder="Type..." type="text">
266
+ </div>
267
+ <div class="nb-form-group">
268
+ <label class="form-label" for="example-form-control-description-prepopulated">Description [Prepopulated]</label>
269
+ <input class="form-control" id="example-form-control-description-prepopulated" name="description" placeholder="Type..." type="text" value="Lorem ipsum dolor sit amet, consectetur adipiscing elit.">
270
+ </div>
271
+ <div class="nb-form-group">
272
+ <label for="example-form-control-note" class="form-label">Note</label>
273
+ <textarea class="form-control" cols="40" id="example-form-control-note" placeholder="Type..." rows="10"></textarea>
274
+ </div>
275
+ </fieldset>
276
+ </div>
277
+
278
+ <div class="col-md-4">
279
+ <fieldset class="mb-16">
280
+ <legend>Comboboxes</legend>
281
+ <div class="nb-form-group">
282
+ <label for="example-form-control-status">Status</label>
283
+ <select
284
+ class="form-control nautobot-select2-api"
285
+ data-depth="0"
286
+ data-query-param-content_types="[&quot;dcim.device&quot;]"
287
+ data-url="/api/extras/statuses/"
288
+ display-field="display"
289
+ id="example-form-control-status"
290
+ name="status"
291
+ placeholder="Select..."
292
+ value-field="id"
293
+ ></select>
294
+ </div>
295
+ <div class="nb-form-group">
296
+ <label for="example-form-control-role-prepopulated">Role [Prepopulated]</label>
297
+ <select
298
+ class="form-control nautobot-select2-api"
299
+ data-depth="0"
300
+ data-query-param-content_types="[&quot;dcim.device&quot;]"
301
+ data-query-param-exclude_m2m="[&quot;true&quot;]"
302
+ data-url="/api/extras/roles/"
303
+ display-field="display"
304
+ id="example-form-control-role-prepopulated"
305
+ name="role"
306
+ placeholder="Select..."
307
+ value-field="id"
308
+ >
309
+ <option value="ca47734b-4e50-4730-a2d7-6e7c768f9aaa" selected>My Role</option>
310
+ </select>
249
311
  </div>
312
+ <div class="nb-form-group">
313
+ <label for="example-form-control-tags">Tags</label>
314
+ <select
315
+ class="form-control nautobot-select2-api"
316
+ data-depth="0"
317
+ data-query-param-content_types="[&quot;dcim.device&quot;]"
318
+ data-url="/api/extras/tags/"
319
+ display-field="display"
320
+ id="example-form-control-tags"
321
+ multiple="multiple"
322
+ name="tags"
323
+ placeholder="Select..."
324
+ value-field="id"
325
+ ></select>
326
+ </div>
327
+ <div class="nb-form-group">
328
+ <label for="example-form-control-dynamic-groups-prepopulated">Dynamic Groups [Prepopulated]</label>
329
+ <select
330
+ class="nautobot-select2-api form-control"
331
+ data-depth="0"
332
+ data-multiple="1"
333
+ data-query-param-content_type="[&quot;dcim.device&quot;]"
334
+ data-query-param-exclude_m2m="[&quot;true&quot;]"
335
+ data-query-param-group_type="[&quot;static&quot;]"
336
+ data-url="/api/extras/dynamic-groups/"
337
+ display-field="display"
338
+ id="example-form-control-dynamic-groups-prepopulated"
339
+ multiple="multiple"
340
+ name="dynamic_groups"
341
+ placeholder="Select..."
342
+ value-field="name"
343
+ >
344
+ <option value="2f31a150-4b09-44dc-a2ad-90004367c943" selected>My Dynamic Group 1</option>
345
+ <option value="5c2ed7ba-b823-44a0-aef9-44b01b2b92d9" selected>My Dynamic Group 2</option>
346
+ </select>
347
+ </div>
348
+ </fieldset>
349
+ </div>
350
+
351
+ <div class="col-md-4">
352
+ <fieldset class="mb-16">
353
+ <legend>Checkboxes</legend>
354
+ <div class="form-check">
355
+ <input class="form-check-input" id="example-form-control-checkbox-1" name="example-form-control-checkbox" type="checkbox" value="1">
356
+ <label class="form-check-label" for="example-form-control-checkbox-1">
357
+ Checkbox 1
358
+ </label>
359
+ </div>
360
+ <div class="form-check">
361
+ <input checked class="form-check-input" id="example-form-control-checkbox-2-preselected" name="example-form-control-checkbox" type="checkbox" value="2">
362
+ <label class="form-check-label" for="example-form-control-checkbox-2-preselected">
363
+ Checkbox 2 [Preselected]
364
+ </label>
365
+ </div>
366
+ </fieldset>
367
+
368
+ <fieldset class="mb-16">
369
+ <legend>Radios</legend>
370
+ <div class="form-check">
371
+ <input class="form-check-input" id="example-form-control-radio-1" name="example-form-control-radio" type="radio" value="1">
372
+ <label class="form-check-label" for="example-form-control-radio-1">
373
+ Radio 1
374
+ </label>
375
+ </div>
376
+ <div class="form-check">
377
+ <input checked class="form-check-input" id="example-form-control-radio-2-preselected" name="example-form-control-radio" type="radio" value="2">
378
+ <label class="form-check-label" for="example-form-control-radio-2-preselected">
379
+ Radio 2 [Preselected]
380
+ </label>
381
+ </div>
382
+ </fieldset>
383
+
384
+ <fieldset class="mb-16">
385
+ <legend>Buttons</legend>
386
+ <div class="hstack gap-8">
387
+ <button class="btn btn-primary" name="_apply" type="submit">
388
+ <span aria-hidden="true" class="mdi mdi-check me-4"></span><!--
389
+ -->Apply
390
+ </button>
391
+ <button class="btn btn-danger" name="_confirm" type="submit">
392
+ <span aria-hidden="true" class="mdi mdi-trash-can-outline me-4"></span><!--
393
+ -->Delete
394
+ </button>
395
+ <a class="btn btn-secondary" href="#">
396
+ <span aria-hidden="true" class="mdi mdi-close me-4"></span><!--
397
+ -->Cancel
398
+ </a>
399
+ </div>
400
+ </fieldset>
401
+ </div>
402
+ </form>
403
+ <!-- End example of form controls -->
404
+ <hr class="border-top">
405
+
406
+ <!-- Begin example of home page panel -->
407
+ <div class="nb-draggable-container nb-transition-fade">
408
+ <div class="card nb-draggable">
409
+ <div class="card-header nb-draggable-handle">
410
+ <strong class="text-body nb-text-none">Home Page Panel</strong>
411
+ <span class="btn stretched-link nb-collapse-toggle nb-cursor-unset" role="button" tabindex="0" aria-expanded="false">
412
+ <span class="mdi mdi-chevron-down"></span>
413
+ </span>
250
414
  </div>
251
- <!-- End example of home page panel -->
415
+ <ul class="list-group collapse overflow-y-auto show">
416
+ <li class="list-group-item">
417
+ <span class="badge bg-primary float-end my-1">123</span>
418
+ <h4 class="fw-normal lh-base"><a>Locations</a></h4>
419
+ <p class="fs-5 mb-0 mt-4 text-secondary">Hierarchical geographic locations</p>
420
+ </li>
421
+ <li class="list-group-item">
422
+ <span class="badge bg-primary float-end my-1"><span class="mdi mdi-lock" aria-hidden="true"></span></span>
423
+ <h4 class="fw-normal lh-base">Tenants</h4>
424
+ <p class="fs-5 mb-0 mt-4 text-secondary">Customers or departments</p>
425
+ </li>
426
+ </ul>
252
427
  </div>
253
428
  </div>
254
- <hr>
429
+ <!-- End example of home page panel -->
430
+ <hr class="border-top">
255
431
 
256
432
  <div class="row">
257
433
  <div class="col-md-6">
258
434
  <h1>Buttons</h1>
259
- <div class="panel panel-default">
260
- <table class="table table-hover panel-body attr-table">
261
- <tr>
262
- <td><code>btn-lg</code></td>
263
- <td>
264
- <button type="button" class="btn btn-lg btn-default">Default</button>
265
- <button type="button" class="btn btn-lg btn-primary">Primary</button>
266
- <button type="button" class="btn btn-lg btn-success">Success</button>
267
- <button type="button" class="btn btn-lg btn-info">Info</button>
268
- <button type="button" class="btn btn-lg btn-warning">Warning</button>
269
- <button type="button" class="btn btn-lg btn-danger">Danger</button>
270
- <button type="button" class="btn btn-lg btn-link">Link</button>
271
- </td>
272
- </tr>
273
- <tr>
274
- <td><code>btn</code></td>
275
- <td>
276
- <button type="button" class="btn btn-default">Default</button>
277
- <button type="button" class="btn btn-primary">Primary</button>
278
- <button type="button" class="btn btn-success">Success</button>
279
- <button type="button" class="btn btn-info">Info</button>
280
- <button type="button" class="btn btn-warning">Warning</button>
281
- <button type="button" class="btn btn-danger">Danger</button>
282
- <button type="button" class="btn btn-link">Link</button>
283
- </td>
284
- </tr>
285
- <tr>
286
- <td><code>btn-sm</code></td>
287
- <td>
288
- <button type="button" class="btn btn-sm btn-default">Default</button>
289
- <button type="button" class="btn btn-sm btn-primary">Primary</button>
290
- <button type="button" class="btn btn-sm btn-success">Success</button>
291
- <button type="button" class="btn btn-sm btn-info">Info</button>
292
- <button type="button" class="btn btn-sm btn-warning">Warning</button>
293
- <button type="button" class="btn btn-sm btn-danger">Danger</button>
294
- <button type="button" class="btn btn-sm btn-link">Link</button>
295
- </td>
296
- </tr>
297
- <tr>
298
- <td><code>btn-xs</code></td>
299
- <td>
300
- <button type="button" class="btn btn-xs btn-default">Default</button>
301
- <button type="button" class="btn btn-xs btn-primary">Primary</button>
302
- <button type="button" class="btn btn-xs btn-success">Success</button>
303
- <button type="button" class="btn btn-xs btn-info">Info</button>
304
- <button type="button" class="btn btn-xs btn-warning">Warning</button>
305
- <button type="button" class="btn btn-xs btn-danger">Danger</button>
306
- <button type="button" class="btn btn-xs btn-link">Link</button>
307
- </td>
308
- </tr>
309
- <tr>
310
- <td><code>btn disabled</code></td>
311
- <td>
312
- <button type="button" class="btn btn-default disabled">Default</button>
313
- <button type="button" class="btn btn-primary disabled">Primary</button>
314
- <button type="button" class="btn btn-success disabled">Success</button>
315
- <button type="button" class="btn btn-info disabled">Info</button>
316
- <button type="button" class="btn btn-warning disabled">Warning</button>
317
- <button type="button" class="btn btn-danger disabled">Danger</button>
318
- <button type="button" class="btn btn-link disabled">Link</button>
319
- </td>
320
- </tr>
321
- </table>
435
+ <div class="card">
436
+ <div class="table-responsive">
437
+ <table class="table">
438
+ <tr>
439
+ <td><code>btn</code></td>
440
+ <td>
441
+ <button type="button" class="btn btn-secondary">Secondary</button>
442
+ <button type="button" class="btn btn-primary">Primary</button>
443
+ <button type="button" class="btn btn-success">Success</button>
444
+ <button type="button" class="btn btn-info">Info</button>
445
+ <button type="button" class="btn btn-warning">Warning</button>
446
+ <button type="button" class="btn btn-danger">Danger</button>
447
+ <button type="button" class="btn btn-link">Link</button>
448
+ </td>
449
+ </tr>
450
+ <tr>
451
+ <td><code>btn-sm</code></td>
452
+ <td>
453
+ <button type="button" class="btn btn-sm btn-secondary">Secondary</button>
454
+ <button type="button" class="btn btn-sm btn-primary">Primary</button>
455
+ <button type="button" class="btn btn-sm btn-success">Success</button>
456
+ <button type="button" class="btn btn-sm btn-info">Info</button>
457
+ <button type="button" class="btn btn-sm btn-warning">Warning</button>
458
+ <button type="button" class="btn btn-sm btn-danger">Danger</button>
459
+ <button type="button" class="btn btn-sm btn-link">Link</button>
460
+ </td>
461
+ </tr>
462
+ <tr>
463
+ <td><code>btn disabled</code></td>
464
+ <td>
465
+ <button type="button" class="btn btn-secondary disabled">Secondary</button>
466
+ <button type="button" class="btn btn-primary disabled">Primary</button>
467
+ <button type="button" class="btn btn-success disabled">Success</button>
468
+ <button type="button" class="btn btn-info disabled">Info</button>
469
+ <button type="button" class="btn btn-warning disabled">Warning</button>
470
+ <button type="button" class="btn btn-danger disabled">Danger</button>
471
+ <button type="button" class="btn btn-link disabled">Link</button>
472
+ </td>
473
+ </tr>
474
+ <tr>
475
+ <td><code>btn-group</code> like radio buttons</td>
476
+ <td>
477
+ <div class="btn-group" role="group">
478
+ <button type="button" class="btn btn-primary bg-primary nb-text-body-bg">Current Active Option</button>
479
+ <button type="button" class="btn btn-primary">Alternative Option</button>
480
+ </div>
481
+ </td>
482
+ </tr>
483
+ </table>
484
+ </div>
322
485
  </div>
323
486
  </div>
324
487
  <div class="col-md-6">
325
488
  <h1>Headings and Labels</h1>
326
- <div class="panel panel-default">
327
- <div class="panel-body">
489
+ <div class="card">
490
+ <div class="card-body">
328
491
  <h1>
329
492
  h1. Heading 1
330
493
  <small>title for most object views</small>
331
- <span class="label label-default">Default</span>
332
- <span class="label label-primary">Primary</span>
333
- <span class="label label-transparent">Transparent</span>
334
- <span class="label label-success">Success</span>
335
- <span class="label label-info">Info</span>
336
- <span class="label label-warning">Warning</span>
337
- <span class="label label-danger">Danger</span>
494
+ <span class="badge border">Secondary</span>
495
+ <span class="badge bg-primary">Primary</span>
496
+ <span class="badge border border-primary text-primary">Transparent</span>
497
+ <span class="badge bg-success">Success</span>
498
+ <span class="badge bg-info">Info</span>
499
+ <span class="badge bg-warning">Warning</span>
500
+ <span class="badge bg-danger">Danger</span>
338
501
  </h1>
339
502
  <h2>
340
503
  h2. Heading 2
341
504
  <small>used for special purposes such as Location detail "badges"</small>
342
- <span class="label label-default">Default</span>
343
- <span class="label label-primary">Primary</span>
344
- <span class="label label-transparent">Transparent</span>
345
- <span class="label label-success">Success</span>
346
- <span class="label label-info">Info</span>
347
- <span class="label label-warning">Warning</span>
348
- <span class="label label-danger">Danger</span>
505
+ <span class="badge border">Secondary</span>
506
+ <span class="badge bg-primary">Primary</span>
507
+ <span class="badge border border-primary text-primary">Transparent</span>
508
+ <span class="badge bg-success">Success</span>
509
+ <span class="badge bg-info">Info</span>
510
+ <span class="badge bg-warning">Warning</span>
511
+ <span class="badge bg-danger">Danger</span>
349
512
  </h2>
350
513
  <h3>
351
514
  h3. Heading 3
352
515
  <small>title for object create/edit forms</small>
353
- <span class="label label-default">Default</span>
354
- <span class="label label-primary">Primary</span>
355
- <span class="label label-transparent">Transparent</span>
356
- <span class="label label-success">Success</span>
357
- <span class="label label-info">Info</span>
358
- <span class="label label-warning">Warning</span>
359
- <span class="label label-danger">Danger</span>
516
+ <span class="badge border">Secondary</span>
517
+ <span class="badge bg-primary">Primary</span>
518
+ <span class="badge border border-primary text-primary">Transparent</span>
519
+ <span class="badge bg-success">Success</span>
520
+ <span class="badge bg-info">Info</span>
521
+ <span class="badge bg-warning">Warning</span>
522
+ <span class="badge bg-danger">Danger</span>
360
523
  </h3>
361
524
  <h4>
362
525
  h4. Heading 4
363
526
  <small>used in modal titles and a few others</small>
364
- <span class="label label-default">Default</span>
365
- <span class="label label-primary">Primary</span>
366
- <span class="label label-transparent">Transparent</span>
367
- <span class="label label-success">Success</span>
368
- <span class="label label-info">Info</span>
369
- <span class="label label-warning">Warning</span>
370
- <span class="label label-danger">Danger</span>
527
+ <span class="badge border">Secondary</span>
528
+ <span class="badge bg-primary">Primary</span>
529
+ <span class="badge border border-primary text-primary">Transparent</span>
530
+ <span class="badge bg-success">Success</span>
531
+ <span class="badge bg-info">Info</span>
532
+ <span class="badge bg-warning">Warning</span>
533
+ <span class="badge bg-danger">Danger</span>
371
534
  </h4>
372
535
  <h5>
373
536
  h5. Heading 5
374
537
  <small>used in user profiles and cable traces</small>
375
- <span class="label label-default">Default</span>
376
- <span class="label label-primary">Primary</span>
377
- <span class="label label-transparent">Transparent</span>
378
- <span class="label label-success">Success</span>
379
- <span class="label label-info">Info</span>
380
- <span class="label label-warning">Warning</span>
381
- <span class="label label-danger">Danger</span>
538
+ <span class="badge border">Secondary</span>
539
+ <span class="badge bg-primary">Primary</span>
540
+ <span class="badge border border-primary text-primary">Transparent</span>
541
+ <span class="badge bg-success">Success</span>
542
+ <span class="badge bg-info">Info</span>
543
+ <span class="badge bg-warning">Warning</span>
544
+ <span class="badge bg-danger">Danger</span>
382
545
  </h5>
383
546
  <h6>
384
547
  h6. Heading 6
385
548
  <small>Unused in core</small>
386
- <span class="label label-default">Default</span>
387
- <span class="label label-primary">Primary</span>
388
- <span class="label label-transparent">Transparent</span>
389
- <span class="label label-success">Success</span>
390
- <span class="label label-info">Info</span>
391
- <span class="label label-warning">Warning</span>
392
- <span class="label label-danger">Danger</span>
549
+ <span class="badge border">Secondary</span>
550
+ <span class="badge bg-primary">Primary</span>
551
+ <span class="badge border border-primary text-primary">Transparent</span>
552
+ <span class="badge bg-success">Success</span>
553
+ <span class="badge bg-info">Info</span>
554
+ <span class="badge bg-warning">Warning</span>
555
+ <span class="badge bg-danger">Danger</span>
393
556
  </h6>
394
557
  <p>
395
558
  p. Paragraph
396
559
  <small>Small text</small>
397
- <span class="label label-default">Default</span>
398
- <span class="label label-primary">Primary</span>
399
- <span class="label label-transparent">Transparent</span>
400
- <span class="label label-success">Success</span>
401
- <span class="label label-info">Info</span>
402
- <span class="label label-warning">Warning</span>
403
- <span class="label label-danger">Danger</span>
560
+ <span class="badge border">Secondary</span>
561
+ <span class="badge bg-primary">Primary</span>
562
+ <span class="badge border border-primary text-primary">Transparent</span>
563
+ <span class="badge bg-success">Success</span>
564
+ <span class="badge bg-info">Info</span>
565
+ <span class="badge bg-warning">Warning</span>
566
+ <span class="badge bg-danger">Danger</span>
404
567
  </p>
405
568
  </div>
406
569
  </div>
@@ -411,82 +574,55 @@
411
574
  <h1>Tables</h1>
412
575
  <div class="row">
413
576
  <div class="col-md-6">
414
- <h2>Panel Table With Heading</h2>
415
- <div class="panel panel-default">
416
- <div class="panel-heading">Heading Text</div>
417
- <table class="table table-hover table-headings">
418
- <thead>
419
- <tr>
420
- <th>#</th>
421
- <th>First Name</th>
422
- <th>Last Name</th>
423
- <th>Username</th>
424
- </tr>
425
- </thead>
426
- <tbody>
427
- <tr>
428
- <td>1</td>
429
- <td>Mark</td>
430
- <td>Otto</td>
431
- <td>@mdo</td>
432
- </tr>
433
- <tr>
434
- <td>2</td>
435
- <td>Jacob</td>
436
- <td>Thornton</td>
437
- <td>@fat</td>
438
- </tr>
439
- <tr>
440
- <td>3</td>
441
- <td>Larry</td>
442
- <td>the Bird</td>
443
- <td>@twitter</td>
444
- </tr>
445
- </tbody>
446
- </table>
447
- </div>
448
- </div>
449
- <div class="col-md-6">
450
- <h2>Condensed Table (use with caution)</h2>
451
- <div class="panel panel-default">
452
- <table class="table table-condensed table-hover table-headings">
453
- <thead>
454
- <tr>
455
- <th>#</th>
456
- <th>First Name</th>
457
- <th>Last Name</th>
458
- <th>Username</th>
459
- </tr>
460
- </thead>
461
- <tbody>
462
- <tr>
463
- <td>1</td>
464
- <td>Mark</td>
465
- <td>Otto</td>
466
- <td>@mdo</td>
467
- </tr>
468
- <tr>
469
- <td>2</td>
470
- <td>Jacob</td>
471
- <td>Thornton</td>
472
- <td>@fat</td>
473
- </tr>
474
- <tr>
475
- <td>3</td>
476
- <td colspan="2">Larry the Bird</td>
477
- <td>@twitter</td>
478
- </tr>
479
- </tbody>
480
- </table>
577
+ <h2>Card Table With Header</h2>
578
+ <div class="card">
579
+ <div class="card-header"><strong>Header Text</strong></div>
580
+ <div class="table-responsive">
581
+ <table class="table table-hover nb-table-headings">
582
+ <thead>
583
+ <tr>
584
+ <th>#</th>
585
+ <th>First Name</th>
586
+ <th>Last Name</th>
587
+ <th>Username</th>
588
+ </tr>
589
+ </thead>
590
+ <tbody>
591
+ <tr>
592
+ <td>1</td>
593
+ <td>Mark</td>
594
+ <td>Otto</td>
595
+ <td>@mdo</td>
596
+ </tr>
597
+ <tr>
598
+ <td>2</td>
599
+ <td>Jacob</td>
600
+ <td>Thornton</td>
601
+ <td>@fat</td>
602
+ </tr>
603
+ <tr>
604
+ <td>3</td>
605
+ <td>Larry</td>
606
+ <td>the Bird</td>
607
+ <td>@twitter</td>
608
+ </tr>
609
+ </tbody>
610
+ </table>
611
+ </div>
481
612
  </div>
482
613
  </div>
483
614
  </div>
484
615
  <div class="row">
485
616
  <div class="col-md-6">
486
617
  <h2>Attribute Table for Object Detail View</h2>
487
- <div class="panel panel-default">
488
- <div class="panel-heading">Object Attributes</div>
489
- <table class="table table-hover panel-body attr-table">
618
+ <div class="card">
619
+ <div class="card-header">
620
+ <strong>Object Attributes</strong>
621
+ <a class="btn stretched-link nb-collapse-toggle" role="button" aria-expanded="true">
622
+ <span class="mdi mdi-chevron-down"></span>
623
+ </a>
624
+ </div>
625
+ <table class="table table-hover attr-table">
490
626
  <tr>
491
627
  <td>Attribute</td>
492
628
  <td>Value</td>
@@ -504,101 +640,107 @@
504
640
  </div>
505
641
  <div class="col-md-6">
506
642
  <h2>Table with colored rows</h2>
507
- <div class="panel panel-default">
508
- <table class="table table-hover panel-body table-headings">
509
- <thead>
510
- <tr>
511
- <th>Class</th>
512
- </tr>
513
- </thead>
514
- <tbody>
515
- <tr class="active"><td>Active</td></tr>
516
- <tr class="success"><td>Success</td></tr>
517
- <tr class="info"><td>Info</td></tr>
518
- <tr class="warning"><td>Warning</td></tr>
519
- <tr class="danger"><td>Danger</td></tr>
520
- </tbody>
521
- </table>
643
+ <div class="card">
644
+ <div class="table-responsive">
645
+ <table class="table table-hover nb-table-headings">
646
+ <thead>
647
+ <tr>
648
+ <th>Class</th>
649
+ </tr>
650
+ </thead>
651
+ <tbody>
652
+ <tr class="table-secondary"><td>Secondary</td></tr>
653
+ <tr class="table-success"><td>Success</td></tr>
654
+ <tr class="table-info"><td>Info</td></tr>
655
+ <tr class="table-warning"><td>Warning</td></tr>
656
+ <tr class="table-danger"><td>Danger</td></tr>
657
+ </tbody>
658
+ </table>
659
+ </div>
522
660
  </div>
523
661
  </div>
524
662
  </div>
525
663
  <div class="row">
526
664
  <div class="col-md-6">
527
665
  <h2>Striped Table (not generally recommended)</h2>
528
- <div class="panel panel-default">
529
- <table class="table table-striped table-hover table-headings">
530
- <thead>
531
- <tr>
532
- <th>#</th>
533
- <th>First Name</th>
534
- <th>Last Name</th>
535
- <th>Username</th>
536
- </tr>
537
- </thead>
538
- <tbody>
539
- <tr>
540
- <td>1</td>
541
- <td>Mark</td>
542
- <td>Otto</td>
543
- <td>@mdo</td>
544
- </tr>
545
- <tr>
546
- <td>2</td>
547
- <td>Jacob</td>
548
- <td>Thornton</td>
549
- <td>@fat</td>
550
- </tr>
551
- <tr>
552
- <td>3</td>
553
- <td>Larry</td>
554
- <td>the Bird</td>
555
- <td>@twitter</td>
556
- </tr>
557
- </tbody>
558
- </table>
666
+ <div class="card">
667
+ <div class="table-responsive">
668
+ <table class="table table-hover table-striped nb-table-headings">
669
+ <thead>
670
+ <tr>
671
+ <th>#</th>
672
+ <th>First Name</th>
673
+ <th>Last Name</th>
674
+ <th>Username</th>
675
+ </tr>
676
+ </thead>
677
+ <tbody>
678
+ <tr>
679
+ <td>1</td>
680
+ <td>Mark</td>
681
+ <td>Otto</td>
682
+ <td>@mdo</td>
683
+ </tr>
684
+ <tr>
685
+ <td>2</td>
686
+ <td>Jacob</td>
687
+ <td>Thornton</td>
688
+ <td>@fat</td>
689
+ </tr>
690
+ <tr>
691
+ <td>3</td>
692
+ <td>Larry</td>
693
+ <td>the Bird</td>
694
+ <td>@twitter</td>
695
+ </tr>
696
+ </tbody>
697
+ </table>
698
+ </div>
559
699
  </div>
560
700
  </div>
561
701
  <div class="col-md-6">
562
702
  <h2>Bordered Table (not generally recommended)</h2>
563
- <div class="panel panel-default">
564
- <table class="table table-bordered table-hover table-headings">
565
- <thead>
566
- <tr>
567
- <th>#</th>
568
- <th>First Name</th>
569
- <th>Last Name</th>
570
- <th>Username</th>
571
- </tr>
572
- </thead>
573
- <tbody>
574
- <tr>
575
- <td rowspan="2">1</td>
576
- <td>Mark</td>
577
- <td>Otto</td>
578
- <td>@mdo</td>
579
- </tr>
580
- <tr>
581
- <td>Mark</td>
582
- <td>Otto</td>
583
- <td>@TwBootstrap</td>
584
- </tr>
585
- <tr>
586
- <td>2</td>
587
- <td>Jacob</td>
588
- <td>Thornton</td>
589
- <td>@fat</td>
590
- </tr>
591
- <tr>
592
- <td>3</td>
593
- <td colspan="2">Larry the Bird</td>
594
- <td>@twitter</td>
595
- </tr>
596
- </tbody>
597
- </table>
703
+ <div class="card">
704
+ <div class="table-responsive">
705
+ <table class="table table-hover table-bordered nb-table-headings">
706
+ <thead>
707
+ <tr>
708
+ <th>#</th>
709
+ <th>First Name</th>
710
+ <th>Last Name</th>
711
+ <th>Username</th>
712
+ </tr>
713
+ </thead>
714
+ <tbody>
715
+ <tr>
716
+ <td rowspan="2">1</td>
717
+ <td>Mark</td>
718
+ <td>Otto</td>
719
+ <td>@mdo</td>
720
+ </tr>
721
+ <tr>
722
+ <td>Mark</td>
723
+ <td>Otto</td>
724
+ <td>@TwBootstrap</td>
725
+ </tr>
726
+ <tr>
727
+ <td>2</td>
728
+ <td>Jacob</td>
729
+ <td>Thornton</td>
730
+ <td>@fat</td>
731
+ </tr>
732
+ <tr>
733
+ <td>3</td>
734
+ <td colspan="2">Larry the Bird</td>
735
+ <td>@twitter</td>
736
+ </tr>
737
+ </tbody>
738
+ </table>
739
+ </div>
598
740
  </div>
599
741
  </div>
600
742
  </div>
601
- <hr>
743
+ <hr class="border-top">
602
744
 
603
745
  <div class="row">
604
746
  <div class="col-sm-6">
@@ -619,9 +761,9 @@
619
761
 
620
762
  <div class="col-sm-6">
621
763
  <h1>Text Markup</h1>
622
- <pre>def hello():
764
+ <pre><code>def hello():
623
765
  print("Hello World!")
624
- raise SystemExit()</pre>
766
+ raise SystemExit()</code></pre>
625
767
  <div class="row">
626
768
  <div class="col-sm-6">
627
769
  <pre><code class="language-json">{
@@ -646,7 +788,7 @@ This:
646
788
  </div>
647
789
  <div>
648
790
  This is some ordinary text.
649
- <span class="text-muted">This is some muted text.</span>
791
+ <span class="text-secondary">This is some secondary text.</span>
650
792
  <span class="text-primary">This is primary text.</span>
651
793
  <span class="text-success">This is success text.</span>
652
794
  <span class="text-info">This is info text.</span>
@@ -654,113 +796,170 @@ This:
654
796
  <span class="text-danger">This is danger text.</span>
655
797
  <code>This is code text.</code>
656
798
  <kbd>This is kbd text.</kbd>
657
- <span class="bg-primary">This is text with a primary background.</span>
658
- <span class="bg-success">This is text with a success background.</span>
659
- <span class="bg-info">This is text with a info background.</span>
660
- <span class="bg-warning">This is text with a warning background.</span>
661
- <span class="bg-danger">This is text with a danger background.</span>
799
+ <span class="text-bg-primary">This is text with a primary background.</span>
800
+ <span class="text-bg-success">This is text with a success background.</span>
801
+ <span class="text-bg-info">This is text with an info background.</span>
802
+ <span class="text-bg-warning">This is text with a warning background.</span>
803
+ <span class="text-bg-danger">This is text with a danger background.</span>
662
804
  </div>
663
805
  </div>
664
806
  </div>
665
- <hr>
807
+ <hr class="border-top">
666
808
 
667
- <h1>Panels</h1>
809
+ <h1>Cards (former Panels)</h1>
668
810
  <div class="row">
669
811
  <div class="col-sm-4">
670
- <div class="panel panel-default">
671
- <div class="panel-heading">
672
- <h3 class="panel-title">Default</h3>
812
+ <div class="card">
813
+ <div class="card-header">
814
+ <h4>Default</h4>
673
815
  </div>
674
- <div class="panel-body">
675
- Panel content
816
+ <div class="card-body">
817
+ Card content
676
818
  </div>
677
819
  </div>
678
- <div class="panel panel-primary">
679
- <div class="panel-heading">
680
- <h3 class="panel-title">Primary</h3>
820
+ <div class="card border-primary">
821
+ <div class="card-header bg-primary-subtle border-primary text-body">
822
+ <h4>Primary</h4>
681
823
  </div>
682
- <div class="panel-body">
824
+ <div class="card-body">
683
825
  Panel content
684
826
  </div>
685
- <div class="panel-footer">
827
+ <div class="card-footer bg-primary-subtle border-primary text-body">
686
828
  Panel footer
687
829
  </div>
688
830
  </div>
689
831
  </div><!-- /.col-sm-4 -->
690
832
  <div class="col-sm-4">
691
- <div class="panel panel-success">
692
- <div class="panel-heading">
693
- <h3 class="panel-title">Success</h3>
833
+ <div class="card border-success">
834
+ <div class="card-header bg-success-subtle border-success text-body">
835
+ <h4>Success</h4>
694
836
  </div>
695
- <div class="panel-body">
837
+ <div class="card-body">
696
838
  Panel content
697
839
  </div>
698
840
  </div>
699
- <div class="panel panel-info">
700
- <div class="panel-heading">
701
- <h3 class="panel-title">Info</h3>
841
+ <div class="card border-info">
842
+ <div class="card-header bg-info-subtle border-info text-body">
843
+ <h4>Info</h4>
702
844
  </div>
703
- <div class="panel-body">
845
+ <div class="card-body">
704
846
  Panel content
705
847
  </div>
706
- <div class="panel-footer">
848
+ <div class="card-footer bg-info-subtle border-info text-body">
707
849
  Panel footer
708
850
  </div>
709
851
  </div>
710
852
  </div><!-- /.col-sm-4 -->
711
853
  <div class="col-sm-4">
712
- <div class="panel panel-warning">
713
- <div class="panel-heading">
714
- <h3 class="panel-title">Warning</h3>
854
+ <div class="card border-warning">
855
+ <div class="card-header bg-warning-subtle border-warning text-body">
856
+ <h4>Warning</h4>
715
857
  </div>
716
- <div class="panel-body">
858
+ <div class="card-body">
717
859
  Panel content
718
860
  </div>
719
861
  </div>
720
- <div class="panel panel-danger">
721
- <div class="panel-heading">
722
- <h3 class="panel-title">Danger</h3>
862
+ <div class="card border-danger">
863
+ <div class="card-header bg-danger-subtle border-danger text-body">
864
+ <h4>Danger</h4>
723
865
  </div>
724
- <div class="panel-body">
866
+ <div class="card-body">
725
867
  Panel content
726
868
  </div>
727
- <div class="panel-footer">
869
+ <div class="card-footer bg-danger-subtle border-danger text-body">
728
870
  Panel footer
729
871
  </div>
730
872
  </div>
731
873
  </div><!-- /.col-sm-4 -->
732
874
  </div>
733
- <hr>
875
+ <h2>Card with Nav Tabs</h2>
876
+ <div class="row">
877
+ <div class="col-sm-4">
878
+ <div class="card">
879
+ <div class="card-header">
880
+ <ul class="nav nav-tabs card-header-tabs" role="tablist">
881
+ <li class="nav-item" role="presentation">
882
+ <a class="nav-link active" data-bs-toggle="tab" href="#tab1" role="tab" aria-controls="tab1" aria-selected="true">Tab 1</a>
883
+ </li>
884
+ <li class="nav-item" role="presentation">
885
+ <a class="nav-link" data-bs-toggle="tab" href="#tab2" role="tab" aria-controls="tab2" aria-selected="false">Tab 2</a>
886
+ </li>
887
+ <li class="nav-item" role="presentation">
888
+ <a class="nav-link" data-bs-toggle="tab" href="#tab3" role="tab" aria-controls="tab3" aria-selected="false">Tab 3</a>
889
+ </li>
890
+ </ul>
891
+ </div>
892
+ <div class="card-body">
893
+ <div class="tab-content">
894
+ <div class="tab-pane fade show active" id="tab1" role="tabpanel" aria-labelledby="tab1-tab">
895
+ Tab 1 content
896
+ </div>
897
+ <div class="tab-pane fade" id="tab2" role="tabpanel" aria-labelledby="tab2-tab">
898
+ Tab 2 content
899
+ </div>
900
+ <div class="tab-pane fade" id="tab3" role="tabpanel" aria-labelledby="tab3-tab">
901
+ Tab 3 content
902
+ </div>
903
+ </div>
904
+ </div>
905
+ </div>
906
+ </div><!-- /.col-sm-4 -->
907
+ </div>
908
+
734
909
 
910
+ <hr>
911
+ <h1>Utilization graphs</h1>
912
+ <p><i>Note: These progress bars use the <code>utilization_graph</code> template tags.</i></p>
913
+ <div class="row">
914
+ <div class="col-md-4">
915
+ {% utilization_graph_raw_data 50 100 %}
916
+ {% utilization_graph_raw_data 25 100 %}
917
+ </div>
918
+ <div class="col-md-4">
919
+ {% utilization_graph_raw_data 75 100 %}
920
+ </div>
921
+ <div class="col-md-4">
922
+ {% utilization_graph_raw_data 100 100 %}
923
+ </div>
924
+ </div>
925
+ <hr>
735
926
  <h1>Progress bars</h1>
927
+ <p><i>Note: These progress bars are Bootstrap primitives.</i></p>
736
928
  <div class="row">
737
929
  <div class="col-md-4">
738
930
  <div class="progress">
739
- <div class="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 60%;"><span class="sr-only">60% Complete</span></div>
931
+ <div class="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 60%;">60%</div>
740
932
  </div>
741
933
  <div class="progress">
742
- <div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="width: 40%"><span class="sr-only">40% Complete (success)</span></div>
934
+ <div class="progress-bar" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="width: 40%;">40%</div>
743
935
  </div>
744
936
  <div class="progress">
745
- <div class="progress-bar progress-bar-info" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100" style="width: 20%"><span class="sr-only">20% Complete</span></div>
937
+ <span>20%</span>
938
+ <div class="progress-bar" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100" style="width: 20%;"></div>
746
939
  </div>
747
940
  </div>
748
941
  <div class="col-md-4">
749
942
  <div class="progress">
750
- <div class="progress-bar progress-bar-warning" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 60%"><span class="sr-only">60% Complete (warning)</span></div>
943
+ <div class="progress-bar bg-danger" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 60%;">60% (with bg-danger)</div>
944
+ </div>
945
+ <div class="progress">
946
+ <div class="progress-bar bg-warning" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="width: 40%;">40% (with bg-warning)</div>
751
947
  </div>
752
948
  <div class="progress">
753
- <div class="progress-bar progress-bar-danger" role="progressbar" aria-valuenow="80" aria-valuemin="0" aria-valuemax="100" style="width: 80%"><span class="sr-only">80% Complete (danger)</span></div>
949
+ <span>20% (with bg-success)</span>
950
+ <div class="progress-bar bg-success" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100" style="width: 20%;"></div>
754
951
  </div>
755
952
  </div>
756
953
  <div class="col-md-4">
757
954
  <div class="progress">
758
- <div class="progress-bar progress-bar-striped" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 60%"><span class="sr-only">60% Complete</span></div>
955
+ <div class="progress-bar progress-bar-striped bg-success" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 60%;">60% (with bg-success)</div>
759
956
  </div>
760
957
  <div class="progress">
761
- <div class="progress-bar progress-bar-success" style="width: 35%"><span class="sr-only">35% Complete (success)</span></div>
762
- <div class="progress-bar progress-bar-warning" style="width: 20%"><span class="sr-only">20% Complete (warning)</span></div>
763
- <div class="progress-bar progress-bar-danger" style="width: 10%"><span class="sr-only">10% Complete (danger)</span></div>
958
+ <div class="progress-bar progress-bar-striped" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="width: 40%;">40%</div>
959
+ </div>
960
+ <div class="progress">
961
+ <span>20%</span>
962
+ <div class="progress-bar progress-bar-striped" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100" style="width: 20%;"></div>
764
963
  </div>
765
964
  </div>
766
965
  </div>
@@ -792,138 +991,202 @@ This:
792
991
  <div class="col-sm-4">
793
992
  <div class="list-group">
794
993
  <a href="#" class="list-group-item active">
795
- <h4 class="list-group-item-heading">List group item heading</h4>
796
- <p class="list-group-item-text">Donec id elit non mi porta gravida at eget metus. Maecenas sed diam eget risus varius blandit.</p>
994
+ <h4>List group item heading</h4>
995
+ <p>Donec id elit non mi porta gravida at eget metus. Maecenas sed diam eget risus varius blandit.</p>
797
996
  </a>
798
997
  <a href="#" class="list-group-item">
799
- <h4 class="list-group-item-heading">List group item heading</h4>
800
- <p class="list-group-item-text">Donec id elit non mi porta gravida at eget metus. Maecenas sed diam eget risus varius blandit.</p>
998
+ <h4>List group item heading</h4>
999
+ <p>Donec id elit non mi porta gravida at eget metus. Maecenas sed diam eget risus varius blandit.</p>
801
1000
  </a>
802
1001
  <a href="#" class="list-group-item">
803
- <h4 class="list-group-item-heading">List group item heading</h4>
804
- <p class="list-group-item-text">Donec id elit non mi porta gravida at eget metus. Maecenas sed diam eget risus varius blandit.</p>
1002
+ <h4>List group item heading</h4>
1003
+ <p>Donec id elit non mi porta gravida at eget metus. Maecenas sed diam eget risus varius blandit.</p>
805
1004
  </a>
806
1005
  </div>
807
1006
  </div><!-- /.col-sm-4 -->
808
1007
  </div>
809
- </hr>
810
-
811
- <h1>Wells</h1>
812
- <div class="well">
813
- <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sed diam eget risus varius blandit sit amet non magna. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Cras mattis consectetur purus sit amet fermentum. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Aenean lacinia bibendum nulla sed consectetur.</p>
814
- </div>
815
- <hr>
1008
+ <hr class="border-top">
816
1009
 
817
1010
  <div class="row">
818
1011
  <div class="col-md-3">
819
1012
  <h1>Badges</h1>
820
1013
  <p>
821
- <a href="#">Inbox <span class="badge">42</span></a>
1014
+ <a href="#">Inbox <span class="badge bg-primary">42</span></a>
822
1015
  </p>
823
- <ul class="nav nav-pills" role="tablist">
824
- <li role="presentation" class="active"><a href="#">Home <span class="badge">42</span></a></li>
825
- <li role="presentation"><a href="#">Profile</a></li>
826
- <li role="presentation"><a href="#">Messages <span class="badge">3</span></a></li>
1016
+ <ul class="nav nav-tabs mb-16" role="tablist">
1017
+ <li class="nav-item" role="presentation"><a class="nav-link active" href="#">Home <span class="badge bg-primary">42</span></a></li>
1018
+ <li class="nav-item" role="presentation"><a class="nav-link" href="#">Profile</a></li>
1019
+ <li class="nav-item" role="presentation"><a class="nav-link" href="#">Messages <span class="badge bg-primary">3</span></a></li>
827
1020
  </ul>
1021
+ <p>
1022
+ <span class="badge nb-multi-badge">
1023
+ Multi-badge:
1024
+ <span class="nb-multi-badge-items">
1025
+ <span class="badge">Badge</span>
1026
+ <span class="badge">Badge</span>
1027
+ </span>
1028
+ </span>
1029
+ </p>
1030
+ <p>
1031
+ <span class="badge nb-multi-badge">
1032
+ <button type="button">
1033
+ <span aria-hidden="true" class="mdi mdi-close"></span>
1034
+ <span class="visually-hidden">Remove All</span>
1035
+ </button>
1036
+ Multi-badge:
1037
+ <span class="nb-multi-badge-items">
1038
+ <span class="badge"><!--
1039
+ --><button type="button">
1040
+ <span aria-hidden="true" class="mdi mdi-close"></span>
1041
+ <span class="visually-hidden">Remove</span>
1042
+ </button><!--
1043
+ -->Badge
1044
+ </span>
1045
+ <span class="badge"><!--
1046
+ --><button type="button">
1047
+ <span aria-hidden="true" class="mdi mdi-close"></span>
1048
+ <span class="visually-hidden">Remove</span>
1049
+ </button><!--
1050
+ -->Badge
1051
+ </span>
1052
+ </span>
1053
+ </span>
1054
+ </p>
828
1055
  </div>
829
1056
  <div class="col-md-3">
830
1057
  <h1>Dropdown menus</h1>
831
- <div class="dropdown open theme-dropdown clearfix">
832
- <a id="dropdownMenu1" href="#" class="sr-only dropdown-toggle" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
833
- <ul class="dropdown-menu" aria-labelledby="dropdownMenu1">
834
- <li class="active"><a href="#">Action</a></li>
835
- <li><a href="#">Another action</a></li>
836
- <li><a href="#">Something else here</a></li>
837
- <li role="separator" class="divider"></li>
838
- <li><a href="#">Separated link</a></li>
1058
+ <div class="dropdown">
1059
+ <button class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" type="button" aria-haspopup="true" aria-expanded="false">
1060
+ Dropdown<span class="mdi mdi-chevron-down ms-4" aria-hidden="true"></span>
1061
+ </button>
1062
+ <ul class="dropdown-menu">
1063
+ <li><a class="dropdown-item active" href="#">Action</a></li>
1064
+ <li><a class="dropdown-item" href="#">Another action</a></li>
1065
+ <li><a class="dropdown-item" href="#">Something else here</a></li>
1066
+ <li><hr class="dropdown-divider"></li>
1067
+ <li><a class="dropdown-item active" href="#">Separated link</a></li>
839
1068
  </ul>
840
1069
  </div>
841
1070
  </div>
842
1071
  <div class="col-md-6">
843
1072
  <h1>Navs</h1>
844
- <ul class="nav nav-tabs" role="tablist">
845
- <li role="presentation" class="active"><a href="#">Home</a></li>
846
- <li role="presentation"><a href="#">Profile</a></li>
847
- <li role="presentation"><a href="#">Messages</a></li>
1073
+ <ul class="nav nav-tabs mb-16" role="tablist">
1074
+ <li class="nav-item" role="presentation"><a class="nav-link active" href="#">Home</a></li>
1075
+ <li class="nav-item" role="presentation"><a class="nav-link" href="#">Profile</a></li>
1076
+ <li class="nav-item" role="presentation"><a class="nav-link" href="#">Messages</a></li>
848
1077
  </ul>
849
1078
  <ul class="nav nav-pills" role="tablist">
850
- <li role="presentation" class="active"><a href="#">Home</a></li>
851
- <li role="presentation"><a href="#">Profile</a></li>
852
- <li role="presentation"><a href="#">Messages</a></li>
1079
+ <li class="nav-item" role="presentation"><a class="nav-link active" href="#">Home</a></li>
1080
+ <li class="nav-item" role="presentation"><a class="nav-link" href="#">Profile</a></li>
1081
+ <li class="nav-item" role="presentation"><a class="nav-link" href="#">Messages</a></li>
853
1082
  </ul>
854
1083
  </div>
855
1084
  </div>
856
- <hr>
1085
+ <hr class="border-top">
857
1086
 
858
1087
  <h1>Navbars</h1>
859
1088
  <div class="row">
860
1089
  <div class="col-md-6">
861
- <nav class="navbar navbar-default">
862
- <div class="container">
863
- <div class="navbar-header">
864
- <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
865
- <span class="sr-only">Toggle navigation</span>
866
- <span class="icon-bar"></span>
867
- <span class="icon-bar"></span>
868
- <span class="icon-bar"></span>
869
- </button>
870
- <a class="navbar-brand" href="#">Project name</a>
871
- </div>
872
- <div class="navbar-collapse collapse">
873
- <ul class="nav navbar-nav">
874
- <li class="active"><a href="#">Home</a></li>
875
- <li><a href="#">About</a></li>
876
- <li><a href="#">Contact</a></li>
877
- <li class="dropdown">
878
- <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
879
- <ul class="dropdown-menu">
880
- <li><a href="#">Action</a></li>
881
- <li><a href="#">Another action</a></li>
882
- <li><a href="#">Something else here</a></li>
883
- <li role="separator" class="divider"></li>
884
- <li class="dropdown-header">Nav header</li>
885
- <li><a href="#">Separated link</a></li>
886
- <li><a href="#">One more separated link</a></li>
887
- </ul>
1090
+ <nav class="navbar bg-body-tertiary">
1091
+ <div class="container-fluid">
1092
+ <a class="navbar-brand" href="#">Project name</a>
1093
+ <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbar-example-1" aria-controls="navbar-example-1" aria-expanded="false" aria-label="Toggle navigation">
1094
+ <span class="navbar-toggler-icon"></span>
1095
+ </button>
1096
+ <div class="collapse navbar-collapse" id="navbar-example-1">
1097
+ <ul class="navbar-nav me-auto mb-2 mb-lg-0">
1098
+ <li class="nav-item">
1099
+ <a class="nav-link active" aria-current="page" href="#">Home</a>
888
1100
  </li>
889
- </ul>
890
- </div><!--/.nav-collapse -->
891
- </div>
892
- </nav>
893
- </div>
894
- <div class="col-md-6">
895
- <nav class="navbar navbar-inverse">
896
- <div class="container">
897
- <div class="navbar-header">
898
- <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
899
- <span class="sr-only">Toggle navigation</span>
900
- <span class="icon-bar"></span>
901
- <span class="icon-bar"></span>
902
- <span class="icon-bar"></span>
903
- </button>
904
- <a class="navbar-brand" href="#">Project name</a>
905
- </div>
906
- <div class="navbar-collapse collapse">
907
- <ul class="nav navbar-nav">
908
- <li class="active"><a href="#">Home</a></li>
909
- <li><a href="#">About</a></li>
910
- <li><a href="#">Contact</a></li>
911
- <li class="dropdown">
912
- <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
1101
+ <li class="nav-item">
1102
+ <a class="nav-link" href="#">About</a>
1103
+ </li>
1104
+ <li class="nav-item">
1105
+ <a class="nav-link" href="#">Contact</a>
1106
+ </li>
1107
+ <li class="nav-item dropdown">
1108
+ <a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
1109
+ Dropdown<span class="mdi mdi-chevron-down align-top ms-4" aria-hidden="true"></span>
1110
+ </a>
913
1111
  <ul class="dropdown-menu">
914
- <li><a href="#">Action</a></li>
915
- <li><a href="#">Another action</a></li>
916
- <li><a href="#">Something else here</a></li>
917
- <li role="separator" class="divider"></li>
918
- <li class="dropdown-header">Nav header</li>
919
- <li><a href="#">Separated link</a></li>
920
- <li><a href="#">One more separated link</a></li>
1112
+ <li><a class="dropdown-item" href="#">Action</a></li>
1113
+ <li><a class="dropdown-item" href="#">Another action</a></li>
1114
+ <li><a class="dropdown-item" href="#">Something else here</a></li>
1115
+ <li><hr class="dropdown-divider"></li>
1116
+ <li><h6 class="dropdown-header">Nav header</h6></li>
1117
+ <li><a class="dropdown-item" href="#">Separated link</a></li>
1118
+ <li><a class="dropdown-item" href="#">One more separated link</a></li>
921
1119
  </ul>
922
1120
  </li>
923
1121
  </ul>
924
- </div><!--/.nav-collapse -->
1122
+ </div>
925
1123
  </div>
926
1124
  </nav>
927
1125
  </div>
928
1126
  </div>
1127
+ <hr class="border-top">
1128
+
1129
+ <h1>Nautobot Icons</h1>
1130
+ <div class="row">
1131
+ <div class="col-12">
1132
+ <div class="column-gap-8 d-flex flex-wrap px-20 py-16 rounded row-gap-16" style="background-color: #121212;">
1133
+ <div class="icon-preview"><img alt="360-degrees icon" src="{% static 'nautobot-icons/360-degrees.svg' %}">360-degrees</div>
1134
+ <div class="icon-preview"><img alt="arrow-decision icon" src="{% static 'nautobot-icons/arrow-decision.svg' %}">arrow-decision</div>
1135
+ <div class="icon-preview"><img alt="arrows-expand-rec icon" src="{% static 'nautobot-icons/arrows-expand-rec.svg' %}">arrows-expand-rec</div>
1136
+ <div class="icon-preview"><img alt="arrows-move-rec icon" src="{% static 'nautobot-icons/arrows-move-rec.svg' %}">arrows-move-rec</div>
1137
+ <div class="icon-preview"><img alt="arrows-move-2-rec icon" src="{% static 'nautobot-icons/arrows-move-2-rec.svg' %}">arrows-move-2-rec</div>
1138
+ <div class="icon-preview"><img alt="atom icon" src="{% static 'nautobot-icons/atom.svg' %}">atom</div>
1139
+ <div class="icon-preview"><img alt="power icon" src="{% static 'nautobot-icons/battery-3.svg' %}">battery-3</div>
1140
+ <div class="icon-preview"><img alt="branch icon" src="{% static 'nautobot-icons/branch.svg' %}">branch</div>
1141
+ <div class="icon-preview"><img alt="briefcase-2 icon" src="{% static 'nautobot-icons/briefcase-2.svg' %}">briefcase-2</div>
1142
+ <div class="icon-preview"><img alt="cable-data icon" src="{% static 'nautobot-icons/cable-data.svg' %}">cable-data</div>
1143
+ <div class="icon-preview"><img alt="cable-data-2 icon" src="{% static 'nautobot-icons/cable-data-2.svg' %}">cable-data-2</div>
1144
+ <div class="icon-preview"><img alt="cast icon" src="{% static 'nautobot-icons/cast.svg' %}">cast</div>
1145
+ <div class="icon-preview"><img alt="check-circle icon" src="{% static 'nautobot-icons/check-circle.svg' %}">check-circle</div>
1146
+ <div class="icon-preview"><img alt="checkbox-circle icon" src="{% static 'nautobot-icons/checkbox-circle.svg' %}">checkbox-circle</div>
1147
+ <div class="icon-preview"><img alt="checkbox-rec icon" src="{% static 'nautobot-icons/checkbox-rec.svg' %}">checkbox-rec</div>
1148
+ <div class="icon-preview"><img alt="cloud icon" src="{% static 'nautobot-icons/cloud.svg' %}">cloud</div>
1149
+ <div class="icon-preview"><img alt="cloud-check icon" src="{% static 'nautobot-icons/cloud-check.svg' %}">cloud-check</div>
1150
+ <div class="icon-preview"><img alt="cloud-lightning icon" src="{% static 'nautobot-icons/cloud-lightning.svg' %}">cloud-lightning</div>
1151
+ <div class="icon-preview"><img alt="cloud-upload icon" src="{% static 'nautobot-icons/cloud-upload.svg' %}">cloud-upload</div>
1152
+ <div class="icon-preview"><img alt="compass icon" src="{% static 'nautobot-icons/compass.svg' %}">compass</div>
1153
+ <div class="icon-preview"><img alt="control-panel icon" src="{% static 'nautobot-icons/control-panel.svg' %}">control-panel</div>
1154
+ <div class="icon-preview"><img alt="credit-card icon" src="{% static 'nautobot-icons/credit-card.svg' %}">credit-card</div>
1155
+ <div class="icon-preview"><img alt="device-lifecycle icon" src="{% static 'nautobot-icons/device-lifecycle.svg' %}">device-lifecycle</div>
1156
+ <div class="icon-preview"><img alt="direction icon" src="{% static 'nautobot-icons/direction.svg' %}">direction</div>
1157
+ <div class="icon-preview"><img alt="elements icon" src="{% static 'nautobot-icons/elements.svg' %}">elements</div>
1158
+ <div class="icon-preview"><img alt="extensibility icon" src="{% static 'nautobot-icons/extensibility.svg' %}">extensibility</div>
1159
+ <div class="icon-preview"><img alt="globe icon" src="{% static 'nautobot-icons/globe.svg' %}">globe</div>
1160
+ <div class="icon-preview"><img alt="globe-2 icon" src="{% static 'nautobot-icons/globe-2.svg' %}">globe-2</div>
1161
+ <div class="icon-preview"><img alt="hammer icon" src="{% static 'nautobot-icons/hammer.svg' %}">hammer</div>
1162
+ <div class="icon-preview"><img alt="history icon" src="{% static 'nautobot-icons/history.svg' %}">history</div>
1163
+ <div class="icon-preview"><img alt="ip icon" src="{% static 'nautobot-icons/ip.svg' %}">ip</div>
1164
+ <div class="icon-preview"><img alt="laptop icon" src="{% static 'nautobot-icons/laptop.svg' %}">laptop</div>
1165
+ <div class="icon-preview"><img alt="lightning icon" src="{% static 'nautobot-icons/lightning.svg' %}">lightning</div>
1166
+ <div class="icon-preview"><img alt="list-unordered icon" src="{% static 'nautobot-icons/list-unordered.svg' %}">list-unordered</div>
1167
+ <div class="icon-preview"><img alt="map-view icon" src="{% static 'nautobot-icons/map-view.svg' %}">map-view</div>
1168
+ <div class="icon-preview"><img alt="organization icon" src="{% static 'nautobot-icons/organization.svg' %}">organization</div>
1169
+ <div class="icon-preview"><img alt="pin-2 icon" src="{% static 'nautobot-icons/pin-2.svg' %}">pin-2</div>
1170
+ <div class="icon-preview"><img alt="pin-3 icon" src="{% static 'nautobot-icons/pin-3.svg' %}">pin-3</div>
1171
+ <div class="icon-preview"><img alt="plug icon" src="{% static 'nautobot-icons/plug.svg' %}">plug</div>
1172
+ <div class="icon-preview"><img alt="refresh-cw icon" src="{% static 'nautobot-icons/refresh-cw.svg' %}">refresh-cw</div>
1173
+ <div class="icon-preview"><img alt="rocket-2 icon" src="{% static 'nautobot-icons/rocket-2.svg' %}">rocket-2</div>
1174
+ <div class="icon-preview"><img alt="rotate-cw icon" src="{% static 'nautobot-icons/rotate-cw.svg' %}">rotate-cw</div>
1175
+ <div class="icon-preview"><img alt="route icon" src="{% static 'nautobot-icons/route.svg' %}">route</div>
1176
+ <div class="icon-preview"><img alt="secrets icon" src="{% static 'nautobot-icons/secrets.svg' %}">secrets</div>
1177
+ <div class="icon-preview"><img alt="security icon" src="{% static 'nautobot-icons/security.svg' %}">security</div>
1178
+ <div class="icon-preview"><img alt="server icon" src="{% static 'nautobot-icons/server.svg' %}">server</div>
1179
+ <div class="icon-preview"><img alt="server-2 icon" src="{% static 'nautobot-icons/server-2.svg' %}">server-2</div>
1180
+ <div class="icon-preview"><img alt="share icon" src="{% static 'nautobot-icons/share.svg' %}">share</div>
1181
+ <div class="icon-preview"><img alt="shield-check icon" src="{% static 'nautobot-icons/shield-check.svg' %}">shield-check</div>
1182
+ <div class="icon-preview"><img alt="sitemap-outline icon" src="{% static 'nautobot-icons/sitemap-outline.svg' %}">sitemap-outline</div>
1183
+ <div class="icon-preview"><img alt="sliders-vert icon" src="{% static 'nautobot-icons/sliders-vert.svg' %}">sliders-vert</div>
1184
+ <div class="icon-preview"><img alt="sliders-vert-2 icon" src="{% static 'nautobot-icons/sliders-vert-2.svg' %}">sliders-vert-2</div>
1185
+ <div class="icon-preview"><img alt="star icon" src="{% static 'nautobot-icons/star.svg' %}">star</div>
1186
+ <div class="icon-preview"><img alt="star-filled icon" src="{% static 'nautobot-icons/star-filled.svg' %}">star-filled</div>
1187
+ <div class="icon-preview"><img alt="transform icon" src="{% static 'nautobot-icons/transform.svg' %}">transform</div>
1188
+ <div class="icon-preview"><img alt="wifi icon" src="{% static 'nautobot-icons/wifi.svg' %}">wifi</div>
1189
+ </div>
1190
+ </div>
1191
+ </div>
929
1192
  {% endblock %}