diff --git a/app/static/css/index.css b/app/static/css/index.css index 40b02b0..63b5187 100644 --- a/app/static/css/index.css +++ b/app/static/css/index.css @@ -1947,6 +1947,7 @@ a{color:var(--link)} .container-list { flex: 1; overflow-y: auto; + overflow-x: hidden; /* запрещаем горизонтальный скролл и обрезаем переполнение */ padding: 16px; } @@ -1959,6 +1960,10 @@ a{color:var(--link)} cursor: pointer; transition: all 0.2s ease; position: relative; + overflow: hidden; + min-width: 0; + width: 100%; + box-sizing: border-box; } .container-item:hover { @@ -1990,12 +1995,33 @@ a{color:var(--link)} display: flex; align-items: center; gap: 8px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + min-width: 0; + width: 100%; +} + +.container-name i { + flex: 0 0 auto; +} + +.container-name-text { + flex: 1 1 auto; + min-width: 0; + max-width: 100%; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; } .container-service { font-size: 11px; color: var(--muted); margin-bottom: 4px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; } .container-status { diff --git a/app/static/js/index.js b/app/static/js/index.js index 29dcb54..12be81a 100644 --- a/app/static/js/index.js +++ b/app/static/js/index.js @@ -143,6 +143,9 @@ function determineWsState() { } else if (obj.ws.readyState === WebSocket.CLOSED || obj.ws.readyState === WebSocket.CLOSING) { closedConnections.push(id); } + } else if (obj && obj.ajaxOnly) { + // Не удаляем ajax-only объекты из state.open, они используются для AJAX обновлений + continue; } else { closedConnections.push(id); } @@ -150,6 +153,8 @@ function determineWsState() { // Удаляем закрытые соединения closedConnections.forEach(id => { + const obj = state.open[id]; + if (obj && obj.ajaxOnly) return; // сохраняем ajax-only объекты delete state.open[id]; }); @@ -851,9 +856,9 @@ function buildTabs(){ svc.status === 'stopped' ? 'stopped' : 'paused'; item.innerHTML = ` -