diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py
index 98dcfcb3c..800b55bf1 100644
--- a/netbox/dcim/tables/devices.py
+++ b/netbox/dcim/tables/devices.py
@@ -51,34 +51,6 @@ def get_cabletermination_row_class(record):
return ''
-def get_interface_row_class(record):
- if not record.enabled:
- return 'danger'
- elif record.is_virtual:
- return 'primary'
- return get_cabletermination_row_class(record)
-
-
-def get_interface_state_attribute(record):
- """
- Get interface enabled state as string to attach to
DOM element.
- """
- if record.enabled:
- return 'enabled'
- else:
- return 'disabled'
-
-
-def get_interface_connected_attribute(record):
- """
- Get interface disconnected state as string to attach to
DOM element.
- """
- if record.mark_connected or record.cable:
- return 'connected'
- else:
- return 'disconnected'
-
-
#
# Device roles
#
@@ -706,11 +678,12 @@ class DeviceInterfaceTable(InterfaceTable):
'cable', 'connection',
)
row_attrs = {
- 'class': get_interface_row_class,
'data-name': lambda record: record.name,
- 'data-enabled': get_interface_state_attribute,
- 'data-type': lambda record: record.type,
- 'data-connected': get_interface_connected_attribute
+ 'data-enabled': lambda record: "enabled" if record.enabled else "disabled",
+ 'data-virtual': lambda record: "true" if record.is_virtual else "false",
+ 'data-mark-connected': lambda record: "true" if record.mark_connected else "false",
+ 'data-cable-status': lambda record: record.cable.status if record.cable else "",
+ 'data-type': lambda record: record.type
}
diff --git a/netbox/project-static/dist/netbox-dark.css b/netbox/project-static/dist/netbox-dark.css
index 84d1600e3..42f40aeb8 100644
Binary files a/netbox/project-static/dist/netbox-dark.css and b/netbox/project-static/dist/netbox-dark.css differ
diff --git a/netbox/project-static/dist/netbox-light.css b/netbox/project-static/dist/netbox-light.css
index 9048a3286..df5874b48 100644
Binary files a/netbox/project-static/dist/netbox-light.css and b/netbox/project-static/dist/netbox-light.css differ
diff --git a/netbox/project-static/dist/netbox-print.css b/netbox/project-static/dist/netbox-print.css
index 7a3cd7859..6a0bec9f9 100644
Binary files a/netbox/project-static/dist/netbox-print.css and b/netbox/project-static/dist/netbox-print.css differ
diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js
index 97c4ba79c..b6dd11eda 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 bbb2a3cc0..642874c29 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/connectionToggle.ts b/netbox/project-static/src/buttons/connectionToggle.ts
index 74b32dc3a..ed119f738 100644
--- a/netbox/project-static/src/buttons/connectionToggle.ts
+++ b/netbox/project-static/src/buttons/connectionToggle.ts
@@ -7,10 +7,10 @@ import { isTruthy, apiPatch, hasError, getElements } from '../util';
*
* @param element Connection Toggle Button Element
*/
-function toggleConnection(element: HTMLButtonElement): void {
+function setConnectionStatus(element: HTMLButtonElement, status: string): void {
+ // Get the button's row to change its data-cable-status attribute
+ const row = element.parentElement?.parentElement as HTMLTableRowElement;
const url = element.getAttribute('data-url');
- const connected = element.classList.contains('connected');
- const status = connected ? 'planned' : 'connected';
if (isTruthy(url)) {
apiPatch(url, { status }).then(res => {
@@ -19,34 +19,18 @@ function toggleConnection(element: HTMLButtonElement): void {
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.classList.add('btn-info');
- 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');
- }
+ // Update cable status in DOM
+ row.setAttribute('data-cable-status', status);
}
});
}
}
export function initConnectionToggle(): void {
- for (const element of getElements('button.cable-toggle')) {
- element.addEventListener('click', () => toggleConnection(element));
+ for (const element of getElements('button.mark-planned')) {
+ element.addEventListener('click', () => setConnectionStatus(element, 'planned'));
+ }
+ for (const element of getElements('button.mark-installed')) {
+ element.addEventListener('click', () => setConnectionStatus(element, 'connected'));
}
}
diff --git a/netbox/project-static/styles/netbox.scss b/netbox/project-static/styles/netbox.scss
index a38633b5c..360652912 100644
--- a/netbox/project-static/styles/netbox.scss
+++ b/netbox/project-static/styles/netbox.scss
@@ -1075,4 +1075,41 @@ html {
display: none;
}
}
-}
+
+ // Apply row colours to interface lists
+ &[data-netbox-url-name='device_interfaces'] {
+ tr[data-cable-status=connected] {
+ background-color: rgba(map.get($theme-colors, "green"), 0.15);
+ }
+
+ tr[data-cable-status=planned] {
+ background-color: rgba(map.get($theme-colors, "blue"), 0.15);
+ }
+
+ tr[data-cable-status=decommissioning] {
+ background-color: rgba(map.get($theme-colors, "yellow"), 0.15);
+ }
+
+ tr[data-mark-connected=true] {
+ background-color: rgba(map.get($theme-colors, "success"), 0.15);
+ }
+
+ tr[data-virtual=true] {
+ background-color: rgba(map.get($theme-colors, "primary"), 0.15);
+ }
+
+ tr[data-enabled=disabled] {
+ background-color: rgba(map.get($theme-colors, "danger"), 0.15);
+ }
+
+ // Only show the correct button depending on the cable status
+ tr[data-cable-status=connected] button.mark-installed {
+ display: none;
+ }
+
+ tr:not([data-cable-status=connected]) button.mark-planned {
+ display: none;
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/netbox/templates/dcim/inc/cable_toggle_buttons.html b/netbox/templates/dcim/inc/cable_toggle_buttons.html
index 4d8d995c4..1c5427337 100644
--- a/netbox/templates/dcim/inc/cable_toggle_buttons.html
+++ b/netbox/templates/dcim/inc/cable_toggle_buttons.html
@@ -1,12 +1,9 @@
{% load i18n %}
{% if perms.dcim.change_cable %}
- {% if cable.status == 'connected' %}
-
- {% else %}
-
- {% endif %}
+
+
{% endif %}