From dd089453bc006f366a818269aa301a08c1bd0805 Mon Sep 17 00:00:00 2001 From: shats Date: Thu, 12 Feb 2026 22:22:53 +0700 Subject: [PATCH] refactor(MikrotikTools): improve table layout and enhance row display with severity indicators for traceroute results --- frontend/src/MikrotikTools.jsx | 117 ++++++++++++++++++++++++++++----- 1 file changed, 99 insertions(+), 18 deletions(-) diff --git a/frontend/src/MikrotikTools.jsx b/frontend/src/MikrotikTools.jsx index 5e4dfa6..5f39395 100644 --- a/frontend/src/MikrotikTools.jsx +++ b/frontend/src/MikrotikTools.jsx @@ -464,15 +464,15 @@ function MikrotikTools() { ) : (
- +
- + - - - - + + + + @@ -488,19 +488,100 @@ function MikrotikTools() { mainLabel = ip || dns || h.host || '—'; } + const avg = typeof h.avgMs === 'number' ? h.avgMs : null; + const loss = typeof h.loss === 'number' ? h.loss : null; + const statusRaw = (h.status || '').toString(); + const statusLower = statusRaw.toLowerCase(); + const hasTimeout = + statusLower.includes('timeout') || + statusLower.includes('no reply') || + statusLower.includes('unreachable'); + + let severity = 'ok'; + if (hasTimeout || (loss != null && loss >= 50)) { + severity = 'danger'; + } else if ((loss != null && loss > 0) || (avg != null && avg > 200)) { + severity = 'warn'; + } + + const rowClass = + severity === 'danger' + ? 'table-danger' + : severity === 'warn' + ? 'table-warning' + : ''; + return ( - - - - - - - - - );})} + + + + + + + + + ); + })}
ХопХоп Адрес / узелСреднее, мсМин / Макс, мсПотериСтатусСреднее, мсМин / Макс, мсПотериСтатус
{h.hop}{mainLabel}{h.avgMs != null ? h.avgMs.toFixed(1) : '—'} - {h.bestMs != null ? h.bestMs.toFixed(1) : '—'} /{' '} - {h.worstMs != null ? h.worstMs.toFixed(1) : '—'} - {h.loss != null ? `${h.loss}%` : '—'}{h.status || '—'}
+ + {h.hop} + + +
+ + {mainLabel} + + {ip && dns && ( + + IP: {ip} + + )} +
+
+ {avg != null ? ( + 200 + ? 'text-danger fw-semibold' + : avg > 120 + ? 'text-warning fw-semibold' + : '' + } + > + {avg.toFixed(1)} + + ) : ( + '—' + )} + + {h.bestMs != null ? h.bestMs.toFixed(1) : '—'} /{' '} + {h.worstMs != null ? h.worstMs.toFixed(1) : '—'} + + {loss != null ? ( + = 50 + ? 'badge bg-red-lt text-red' + : loss > 0 + ? 'badge bg-yellow-lt text-yellow' + : 'badge bg-green-lt text-green' + } + > + {loss}% + + ) : ( + '—' + )} + + {severity === 'danger' && ( + Проблемный хоп + )} + {severity === 'warn' && ( + Возможная проблема + )} + + {statusRaw || (loss != null || avg != null ? 'OK' : '—')} + +