Add link speed coloring to port bubbles
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -173,6 +173,38 @@
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.node .switch-port.speed-10g {
|
||||||
|
border: 1px solid #4ff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.node .switch-port.speed-1g {
|
||||||
|
border: 1px solid #4f4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.node .switch-port.speed-100m {
|
||||||
|
border: 1px solid #fa0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.node .switch-port.speed-slow {
|
||||||
|
border: 1px solid #f44;
|
||||||
|
}
|
||||||
|
|
||||||
|
.node .uplink.speed-10g {
|
||||||
|
border: 1px solid #4ff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.node .uplink.speed-1g {
|
||||||
|
border: 1px solid #4f4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.node .uplink.speed-100m {
|
||||||
|
border: 1px solid #fa0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.node .uplink.speed-slow {
|
||||||
|
border: 1px solid #f44;
|
||||||
|
}
|
||||||
|
|
||||||
.node.copied {
|
.node.copied {
|
||||||
outline: 2px solid #fff;
|
outline: 2px solid #fff;
|
||||||
}
|
}
|
||||||
@@ -592,6 +624,20 @@
|
|||||||
return !!(node.poe_budget);
|
return !!(node.poe_budget);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getSpeedClass(speed) {
|
||||||
|
if (!speed || speed === 0) return '';
|
||||||
|
if (speed >= 10000000000) return 'speed-10g';
|
||||||
|
if (speed >= 1000000000) return 'speed-1g';
|
||||||
|
if (speed >= 100000000) return 'speed-100m';
|
||||||
|
return 'speed-slow';
|
||||||
|
}
|
||||||
|
|
||||||
|
function getInterfaceSpeed(node) {
|
||||||
|
if (!node.interfaces || node.interfaces.length === 0) return 0;
|
||||||
|
const iface = node.interfaces[0];
|
||||||
|
return iface.stats?.speed || 0;
|
||||||
|
}
|
||||||
|
|
||||||
let anonCounter = 0;
|
let anonCounter = 0;
|
||||||
|
|
||||||
function buildLocationTree(locations, parent) {
|
function buildLocationTree(locations, parent) {
|
||||||
@@ -685,6 +731,8 @@
|
|||||||
} else {
|
} else {
|
||||||
portEl.textContent = switchConnection.port;
|
portEl.textContent = switchConnection.port;
|
||||||
}
|
}
|
||||||
|
const speedClass = getSpeedClass(switchConnection.speed);
|
||||||
|
if (speedClass) portEl.classList.add(speedClass);
|
||||||
div.appendChild(portEl);
|
div.appendChild(portEl);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -701,6 +749,8 @@
|
|||||||
const uplinkEl = document.createElement('div');
|
const uplinkEl = document.createElement('div');
|
||||||
uplinkEl.className = 'uplink';
|
uplinkEl.className = 'uplink';
|
||||||
uplinkEl.textContent = uplinkInfo.localPort + ' → ' + uplinkInfo.parentName + ':' + uplinkInfo.remotePort;
|
uplinkEl.textContent = uplinkInfo.localPort + ' → ' + uplinkInfo.parentName + ':' + uplinkInfo.remotePort;
|
||||||
|
const speedClass = getSpeedClass(uplinkInfo.speed);
|
||||||
|
if (speedClass) uplinkEl.classList.add(speedClass);
|
||||||
div.appendChild(uplinkEl);
|
div.appendChild(uplinkEl);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -963,7 +1013,9 @@
|
|||||||
switchA: nodeA,
|
switchA: nodeA,
|
||||||
switchB: nodeB,
|
switchB: nodeB,
|
||||||
portA: link.interface_a || '?',
|
portA: link.interface_a || '?',
|
||||||
portB: link.interface_b || '?'
|
portB: link.interface_b || '?',
|
||||||
|
speedA: getInterfaceSpeed(link.node_a),
|
||||||
|
speedB: getInterfaceSpeed(link.node_b)
|
||||||
});
|
});
|
||||||
} else if (aIsSwitch && !bIsSwitch) {
|
} else if (aIsSwitch && !bIsSwitch) {
|
||||||
const nodeLoc = nodeLocations.get(nodeB.typeid);
|
const nodeLoc = nodeLocations.get(nodeB.typeid);
|
||||||
@@ -971,7 +1023,8 @@
|
|||||||
switchConnections.set(nodeB.typeid, {
|
switchConnections.set(nodeB.typeid, {
|
||||||
port: link.interface_a || '?',
|
port: link.interface_a || '?',
|
||||||
switchName: getLabel(nodeA),
|
switchName: getLabel(nodeA),
|
||||||
external: !effectiveSwitch || effectiveSwitch.typeid !== nodeA.typeid
|
external: !effectiveSwitch || effectiveSwitch.typeid !== nodeA.typeid,
|
||||||
|
speed: getInterfaceSpeed(link.node_a)
|
||||||
});
|
});
|
||||||
} else if (bIsSwitch && !aIsSwitch) {
|
} else if (bIsSwitch && !aIsSwitch) {
|
||||||
const nodeLoc = nodeLocations.get(nodeA.typeid);
|
const nodeLoc = nodeLocations.get(nodeA.typeid);
|
||||||
@@ -979,7 +1032,8 @@
|
|||||||
switchConnections.set(nodeA.typeid, {
|
switchConnections.set(nodeA.typeid, {
|
||||||
port: link.interface_b || '?',
|
port: link.interface_b || '?',
|
||||||
switchName: getLabel(nodeB),
|
switchName: getLabel(nodeB),
|
||||||
external: !effectiveSwitch || effectiveSwitch.typeid !== nodeB.typeid
|
external: !effectiveSwitch || effectiveSwitch.typeid !== nodeB.typeid,
|
||||||
|
speed: getInterfaceSpeed(link.node_b)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -1033,12 +1087,14 @@
|
|||||||
adjacency.get(link.switchA.typeid).push({
|
adjacency.get(link.switchA.typeid).push({
|
||||||
neighbor: link.switchB,
|
neighbor: link.switchB,
|
||||||
localPort: link.portA,
|
localPort: link.portA,
|
||||||
remotePort: link.portB
|
remotePort: link.portB,
|
||||||
|
localSpeed: link.speedA
|
||||||
});
|
});
|
||||||
adjacency.get(link.switchB.typeid).push({
|
adjacency.get(link.switchB.typeid).push({
|
||||||
neighbor: link.switchA,
|
neighbor: link.switchA,
|
||||||
localPort: link.portB,
|
localPort: link.portB,
|
||||||
remotePort: link.portA
|
remotePort: link.portA,
|
||||||
|
localSpeed: link.speedB
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1091,7 +1147,8 @@
|
|||||||
switchUplinks.set(edge.neighbor.typeid, {
|
switchUplinks.set(edge.neighbor.typeid, {
|
||||||
localPort: edge.localPort,
|
localPort: edge.localPort,
|
||||||
remotePort: edge.remotePort,
|
remotePort: edge.remotePort,
|
||||||
parentName: getLabel(current)
|
parentName: getLabel(current),
|
||||||
|
speed: edge.localSpeed
|
||||||
});
|
});
|
||||||
queue.push(edge.neighbor);
|
queue.push(edge.neighbor);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user