diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index b0c2edb0b..f7eed047e 100644 Binary files a/netbox/project-static/dist/netbox.js and b/netbox/project-static/dist/netbox.js differ diff --git a/netbox/project-static/dist/netbox.js.map b/netbox/project-static/dist/netbox.js.map index 13b13286e..a2d489708 100644 Binary files a/netbox/project-static/dist/netbox.js.map and b/netbox/project-static/dist/netbox.js.map differ diff --git a/netbox/project-static/src/buttons.ts b/netbox/project-static/src/buttons.ts index 311d3cdf9..6fe107a54 100644 --- a/netbox/project-static/src/buttons.ts +++ b/netbox/project-static/src/buttons.ts @@ -1,9 +1,10 @@ -import { isTruthy, getElements } from './util'; +import { createToast } from './toast'; +import { isTruthy, getElements, apiPatch, hasError } from './util'; /** * Add onClick callback for toggling rack elevation images. */ -export function initRackElevation() { +function initRackElevation() { for (const button of getElements('button.toggle-images')) { /** * Toggle the visibility of device images and update the toggle button style. @@ -40,3 +41,58 @@ export function initRackElevation() { button.addEventListener('click', handleClick); } } + +/** + * When the toggle button is clicked, swap the connection status via the API and toggle CSS + * classes to reflect the connection status. + * + * @param element Connection Toggle Button Element + */ +function toggleConnection(element: HTMLButtonElement) { + const id = element.getAttribute('data'); + const connected = element.classList.contains('connected'); + const status = connected ? 'planned' : 'connected'; + + if (isTruthy(id)) { + apiPatch(`/api/dcim/cables/${id}/`, { status }).then(res => { + if (hasError(res)) { + // If the API responds with an error, show it to the user. + createToast('danger', 'Error', res.error).show(); + return; + } else { + // Get the button's row to change its styles. + const row = element.parentElement?.parentElement as HTMLTableRowElement; + // Get the button's icon to change its CSS class. + const icon = element.querySelector('i.mdi, span.mdi') as HTMLSpanElement; + if (connected) { + row.classList.remove('success'); + row.classList.add('info'); + element.classList.remove('connected', 'btn-warning'); + element.title = 'Mark Installed'; + icon.classList.remove('mdi-lan-disconnect'); + icon.classList.add('mdi-lan-connect'); + } else { + row.classList.remove('info'); + row.classList.add('success'); + element.classList.remove('btn-success'); + element.classList.add('connected', 'btn-warning'); + element.title = 'Mark Installed'; + icon.classList.remove('mdi-lan-connect'); + icon.classList.add('mdi-lan-disconnect'); + } + } + }); + } +} + +function initConnectionToggle() { + for (const element of getElements('button.cable-toggle')) { + element.addEventListener('click', () => toggleConnection(element)); + } +} + +export function initButtons() { + for (const func of [initRackElevation, initConnectionToggle]) { + func(); + } +} diff --git a/netbox/project-static/src/netbox.ts b/netbox/project-static/src/netbox.ts index 94ad562a9..a7468407e 100644 --- a/netbox/project-static/src/netbox.ts +++ b/netbox/project-static/src/netbox.ts @@ -4,10 +4,11 @@ import { initApiSelect, initStaticSelect, initColorSelect } from './select'; import { initDateSelector } from './dateSelector'; import { initMessageToasts } from './toast'; import { initSpeedSelector, initForms } from './forms'; -import { initRackElevation } from './buttons'; +import { initButtons } from './buttons'; import { initClipboard } from './clipboard'; import { initSearchBar, initInterfaceFilter } from './search'; import { initGenerateKeyPair, initLockUnlock, initGetSessionKey } from './secrets'; +import { initTabs } from './tabs'; import { initTableConfig } from './tableConfig'; import { getElements } from './util'; @@ -20,13 +21,14 @@ const INITIALIZERS = [ initDateSelector, initSpeedSelector, initColorSelect, - initRackElevation, + initButtons, initClipboard, initGenerateKeyPair, initLockUnlock, initGetSessionKey, initInterfaceFilter, initTableConfig, + initTabs, ] as (() => void)[]; /** diff --git a/netbox/templates/dcim/device/consoleports.html b/netbox/templates/dcim/device/consoleports.html index b74c6a84a..6367246cd 100644 --- a/netbox/templates/dcim/device/consoleports.html +++ b/netbox/templates/dcim/device/consoleports.html @@ -49,7 +49,3 @@ {% include 'inc/paginator.html' with paginator=consoleport_table.paginator page=consoleport_table.page %} {% table_config_form consoleport_table %} {% endblock %} - -{% block javascript %} - -{% endblock %} diff --git a/netbox/templates/dcim/device/consoleserverports.html b/netbox/templates/dcim/device/consoleserverports.html index a09b4b1ad..6dafa84f4 100644 --- a/netbox/templates/dcim/device/consoleserverports.html +++ b/netbox/templates/dcim/device/consoleserverports.html @@ -49,7 +49,3 @@ {% include 'inc/paginator.html' with paginator=consoleserverport_table.paginator page=consoleserverport_table.page %} {% table_config_form consoleserverport_table %} {% endblock %} - -{% block javascript %} - -{% endblock %} diff --git a/netbox/templates/dcim/device/frontports.html b/netbox/templates/dcim/device/frontports.html index eed0d1f79..191112afd 100644 --- a/netbox/templates/dcim/device/frontports.html +++ b/netbox/templates/dcim/device/frontports.html @@ -49,7 +49,3 @@ {% include 'inc/paginator.html' with paginator=frontport_table.paginator page=frontport_table.page %} {% table_config_form frontport_table %} {% endblock %} - -{% block javascript %} - -{% endblock %} diff --git a/netbox/templates/dcim/device/interfaces.html b/netbox/templates/dcim/device/interfaces.html index ae4423ce4..a14e42c2b 100644 --- a/netbox/templates/dcim/device/interfaces.html +++ b/netbox/templates/dcim/device/interfaces.html @@ -8,7 +8,7 @@ {% csrf_token %}
-
Interfaces
+
Interfaces
@@ -52,7 +52,3 @@ {% include 'inc/paginator.html' with paginator=interface_table.paginator page=interface_table.page %} {% table_config_form interface_table %} {% endblock %} - -{% block javascript %} - -{% endblock %} diff --git a/netbox/templates/dcim/device/poweroutlets.html b/netbox/templates/dcim/device/poweroutlets.html index 6a28513bf..599629d8a 100644 --- a/netbox/templates/dcim/device/poweroutlets.html +++ b/netbox/templates/dcim/device/poweroutlets.html @@ -49,7 +49,3 @@ {% include 'inc/paginator.html' with paginator=poweroutlet_table.paginator page=poweroutlet_table.page %} {% table_config_form poweroutlet_table %} {% endblock %} - -{% block javascript %} - -{% endblock %} diff --git a/netbox/templates/dcim/device/powerports.html b/netbox/templates/dcim/device/powerports.html index 352691dcf..59cc29a71 100644 --- a/netbox/templates/dcim/device/powerports.html +++ b/netbox/templates/dcim/device/powerports.html @@ -49,7 +49,3 @@ {% include 'inc/paginator.html' with paginator=powerport_table.paginator page=powerport_table.page %} {% table_config_form powerport_table %} {% endblock %} - -{% block javascript %} - -{% endblock %} diff --git a/netbox/templates/dcim/device/rearports.html b/netbox/templates/dcim/device/rearports.html index 35aec0b14..458170d9c 100644 --- a/netbox/templates/dcim/device/rearports.html +++ b/netbox/templates/dcim/device/rearports.html @@ -49,7 +49,3 @@ {% include 'inc/paginator.html' with paginator=rearport_table.paginator page=rearport_table.page %} {% table_config_form rearport_table %} {% endblock %} - -{% block javascript %} - -{% endblock %} diff --git a/netbox/templates/dcim/inc/cable_toggle_buttons.html b/netbox/templates/dcim/inc/cable_toggle_buttons.html index 586e60713..cf53cf1bb 100644 --- a/netbox/templates/dcim/inc/cable_toggle_buttons.html +++ b/netbox/templates/dcim/inc/cable_toggle_buttons.html @@ -1,11 +1,11 @@ {% if perms.dcim.change_cable %} {% if cable.status == 'connected' %} - + {% else %} - + {% endif %} {% endif %} diff --git a/netbox/templates/virtualization/virtualmachine/interfaces.html b/netbox/templates/virtualization/virtualmachine/interfaces.html index 269fc32bc..cd4a5884a 100644 --- a/netbox/templates/virtualization/virtualmachine/interfaces.html +++ b/netbox/templates/virtualization/virtualmachine/interfaces.html @@ -48,7 +48,3 @@ {% table_config_form interface_table %} {% endblock %} - -{% block javascript %} - -{% endblock %}