diff --git a/internal/webui/index.html b/internal/webui/index.html index c331315..3b606ab 100644 --- a/internal/webui/index.html +++ b/internal/webui/index.html @@ -32,6 +32,8 @@ tr.fdb-row.selected { background: #dbeafe; box-shadow: inset 0.15em 0 0 #2563eb; } .device-detail-table th, .device-detail-table td { border-bottom: 1px solid #e5e7eb; padding: 6px 8px; font-size: 13px; } .subtable-wrap { overflow: auto; max-height: 200px; margin-top: 6px; border: 1px solid #e5e7eb; border-radius: 8px; } + /* Стабильная высота при «Загрузка…», меньше сдвиг графа/легенды под панелью деталей */ + #deviceDetailPanel .subtable-wrap { min-height: 140px; } @@ -395,8 +397,14 @@ return `${dip}${escapeHtml(r.ping)}${escapeHtml(r.name)}${escapeHtml(r.snmp)}${escapeHtml(r.lldp)}`; }) .join(""); + updateDeviceRowSelectionHighlight(); + } + + /** Только подсветка строки — без пересборки таблицы (избегает дёрганья вёрстки/графа). */ + function updateDeviceRowSelectionHighlight() { deviceTableBody.querySelectorAll("tr.device-row").forEach((tr) => { - if (tr.getAttribute("data-ip") === selectedDeviceIP) tr.classList.add("selected"); + const ip = tr.getAttribute("data-ip"); + tr.classList.toggle("selected", ip != null && ip === selectedDeviceIP); }); } @@ -417,6 +425,7 @@ deviceLldpTextTableBody.innerHTML = 'Выберите устройство и порт в Таблице 1.'; updateDeviceLinksSortIndicators(); + updateDeviceRowSelectionHighlight(); } function resolvedLabelRu(resolvedBy) { @@ -664,7 +673,7 @@ } selectedDeviceIP = ip; selectedDeviceLabel.textContent = ip; - renderDeviceTableBody(); + updateDeviceRowSelectionHighlight(); deviceLinksTableBody.innerHTML = 'Загрузка…'; deviceLldpTextTableBody.innerHTML = 'Загрузка…';