fix: restore populated rack and reorder views

This commit is contained in:
2026-08-13 09:37:59 +02:00
parent bc2024ac13
commit a5f8cb62c7
12 changed files with 379 additions and 67 deletions
@@ -15,6 +15,22 @@
console.warn('NetBox Utilities is leaving Reorder Rack in its native layout.', data.status);
return;
}
if (data.schema_version !== 3 || data.complete !== true || !Array.isArray(data.devices)) {
console.warn('NetBox Utilities received an incomplete Reorder Rack payload and kept the native layout.');
return;
}
const validDeviceData = data.devices.every(device => (
Number.isInteger(Number(device.id))
&& ['front', 'rear'].includes(device.face)
&& Number.isInteger(Number(device.grid_x))
&& Number.isInteger(Number(device.grid_y))
&& Number.isInteger(Number(device.grid_width))
&& Number.isInteger(Number(device.grid_height))
));
if (!validDeviceData) {
console.warn('NetBox Utilities received invalid Reorder Rack device data and kept the native layout.');
return;
}
const columns = Number.parseInt(data.columns, 10) || 12;
const gridElements = {
@@ -24,6 +40,15 @@
};
if (!gridElements.front || !gridElements.rear || !gridElements.other) return;
const nativeMountedItems = [
...gridElements.front.querySelectorAll('.grid-stack-item'),
...gridElements.rear.querySelectorAll('.grid-stack-item'),
];
if (!data.devices.length && nativeMountedItems.length) {
console.warn('NetBox Utilities received no replacement devices and kept the populated native layout.');
return;
}
const setAttribute = (element, name, value) => element.setAttribute(name, String(value));
const originalFetch = window.fetch.bind(window);
window.fetch = (resource, options = {}) => {
@@ -11,6 +11,10 @@
console.error('NetBox Utilities could not read the Topology Views rack widths.', error);
return;
}
if (!Array.isArray(payload) && (payload?.schema_version !== 3 || payload?.complete !== true)) {
console.warn('NetBox Utilities received an incomplete Topology Views payload and kept the native layout.');
return;
}
if (!Array.isArray(payload) && payload?.status && payload.status !== 'ready') {
console.warn('NetBox Utilities is leaving Topology Views in its native layout.', payload.status);
return;
@@ -36,6 +40,7 @@
return {
width,
horizontalPosition,
source: String(value.width_source || 'stored'),
leftPercent: Number.isFinite(Number(value.left_percent))
? Number(value.left_percent)
: (horizontalPosition - 1) / width * 100,
@@ -87,6 +92,7 @@
device.classList.add('netbox-utilities-partial-width');
device.dataset.rackWidth = String(placement.width);
device.dataset.horizontalPosition = String(placement.horizontalPosition);
device.dataset.rackWidthSource = placement.source;
device.style.setProperty('--netbox-utilities-rack-device-left', `${placement.leftPercent}%`);
device.style.setProperty('--netbox-utilities-rack-device-width', `${placement.widthPercent}%`);
});