From 846df4fd0b0c0e230e0dcf3728cc7aa84d1fac6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=98=D0=BB=D1=8C=D1=8F=20=D0=91=D1=80=D0=B0=D1=82=D1=81?= =?UTF-8?q?=D0=BA=D0=B8=D1=85?= Date: Wed, 24 Jun 2026 08:59:55 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=B8=D0=BD=D0=B3=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=BA=D0=B5=20=D0=B8=20?= =?UTF-8?q?disable=20=D0=BA=D0=BE=D0=BD=D1=84=D0=B8=D0=B3=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 72 +++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 66 insertions(+), 6 deletions(-) diff --git a/index.html b/index.html index 5619624..2e020f5 100644 --- a/index.html +++ b/index.html @@ -20,6 +20,7 @@ --shadow: 0 20px 60px rgba(0, 0, 0, 0.36); --upload: #a78bfa; --warning: #f59e0b; + --danger: #ef4444; } [data-theme="light"] { @@ -194,6 +195,17 @@ box-shadow: 0 14px 34px var(--accent-soft); } + .server-card:disabled { + cursor: not-allowed; + opacity: 0.62; + transform: none; + box-shadow: var(--shadow); + } + + .server-card:disabled:hover { + border-color: var(--border); + } + .flag { display: grid; place-items: center; @@ -245,6 +257,11 @@ white-space: nowrap; } + .ping.is-offline { + color: var(--danger); + font-weight: 800; + } + .pill { display: inline-flex; align-items: center; @@ -729,13 +746,20 @@ elements.serverGrid.innerHTML = ""; servers.forEach((server) => { + const ping = pingResults.get(server.id); + const isCheckingPing = !pingResults.has(server.id); + const isOffline = ping === null; const button = document.createElement("button"); button.type = "button"; + button.disabled = isOffline; button.className = `server-card${server.id === selectedServerId ? " is-selected" : ""}`; button.addEventListener("click", () => selectServer(server.id)); - const ping = pingResults.get(server.id); - const pingText = ping == null ? "пинг: --" : `пинг: ${Math.round(ping)} мс`; + const pingText = isCheckingPing + ? "проверка..." + : isOffline + ? "нет ответа" + : `пинг: ${Math.round(ping)} мс`; const flagContent = server.flagUrl ? `Флаг ${server.country}` : (server.countryCode || "--").toUpperCase(); @@ -746,7 +770,7 @@ ${escapeHtml(server.name)} ${escapeHtml(server.country)} · ${escapeHtml(server.address)} - ${pingText} + ${pingText} `; elements.serverGrid.appendChild(button); @@ -766,6 +790,8 @@ } function selectServer(serverId) { + if (pingResults.get(serverId) === null) return; + selectedServerId = serverId; localStorage.setItem("selected-server-id", serverId); renderServers(); @@ -778,9 +804,19 @@ function updateSelectedServerText() { const server = getSelectedServer(); - elements.targetServerText.textContent = server - ? `Тест будет запущен через ${server.name} (${server.country}).` - : "Выберите сервер для теста."; + if (!server) { + elements.targetServerText.textContent = "Выберите сервер для теста."; + return; + } + + if (pingResults.get(server.id) === null) { + elements.targetServerText.textContent = + `${server.name} не отвечает. Выберите другой сервер.`; + return; + } + + elements.targetServerText.textContent = + `Тест будет запущен через ${server.name} (${server.country}).`; } async function refreshAllPings() { @@ -794,9 +830,27 @@ renderServers(); }), ); + ensureSelectableServer(); + renderServers(); + updateSelectedServerText(); elements.refreshPingBtn.disabled = false; } + function ensureSelectableServer() { + if (selectedServerId && pingResults.get(selectedServerId) !== null) { + return; + } + + const firstOnlineServer = servers.find((server) => pingResults.get(server.id) !== null); + selectedServerId = firstOnlineServer?.id || null; + + if (selectedServerId) { + localStorage.setItem("selected-server-id", selectedServerId); + } else { + localStorage.removeItem("selected-server-id"); + } + } + async function measurePing(server) { const attempts = 3; const values = []; @@ -1153,6 +1207,12 @@ return; } + if (pingResults.get(server.id) === null) { + elements.serverStatus.textContent = + "Выбранный сервер не отвечает. Запуск теста отключен."; + return; + } + elements.startBtn.disabled = true; resetMetrics();