From c7f55dfee95a543d737c4a93a00bece1a695e555 Mon Sep 17 00:00:00 2001 From: shats Date: Thu, 12 Feb 2026 23:52:42 +0700 Subject: [PATCH] feat(MikrotikTools): add popular targets for ping/traceroute with icons for enhanced user selection --- frontend/src/MikrotikTools.jsx | 189 +++++++++++++++++++-------------- 1 file changed, 109 insertions(+), 80 deletions(-) diff --git a/frontend/src/MikrotikTools.jsx b/frontend/src/MikrotikTools.jsx index 60f7b8d..cac649c 100644 --- a/frontend/src/MikrotikTools.jsx +++ b/frontend/src/MikrotikTools.jsx @@ -12,8 +12,18 @@ import { IconAlertTriangle, IconRefresh, IconSearch, + IconBrandGoogle, + IconBrandYandex, + IconBrandCloudflare, } from '@tabler/icons-react'; +/** Популярные цели для ping/traceroute — карточки с логотипами */ +const POPULAR_TARGETS = [ + { id: 'yandex', name: 'Yandex', target: 'yandex.ru', Icon: IconBrandYandex, color: 'red' }, + { id: 'google', name: 'Google', target: '8.8.8.8', Icon: IconBrandGoogle, color: 'blue' }, + { id: 'cloudflare', name: 'Cloudflare DNS', target: '1.1.1.1', Icon: IconBrandCloudflare, color: 'orange' }, +]; + /** * Раздел "Инструменты → MikroTik": проверка маршрута (traceroute) * с выбором сервера, gateway и домена/IP. @@ -222,35 +232,31 @@ function MikrotikTools() { meta={`Текущий сервер: ${currentServerLabel}`} /> - {/* Выбор сервера для трассировки (в стиле MikrotikBackups / filters) */} + {/* Объединённый блок: сервер + шлюз + популярные цели */}
-

Сервер для проверки

+

Сервер и шлюз для проверки

Доступно Jumphost-серверов: {jumphostServers.length}.{' '} {serverId - ? 'Кликните по другой карточке, чтобы сменить сервер.' + ? 'Кликните по другой карточке, чтобы сменить сервер. Ниже — выбор шлюза и быстрые цели.' : 'Выберите сервер, чтобы выполнять проверки через него.'}
-
-
-
- setServerSearch(e.target.value)} - /> - - - -
-
+
+ setServerSearch(e.target.value)} + /> + + +
@@ -286,10 +292,8 @@ function MikrotikTools() { {flag || s.ip?.slice(0, 2) || '?'}
-
-
- {s.dns || s.ip || id} -
+
+ {s.dns || s.ip || id}
{line && (
@@ -311,72 +315,63 @@ function MikrotikTools() { Текущий сервер:  {currentServerLabel}
-
-
- {/* Шлюз и параметры проверки — только когда выбран сервер, в том же стиле что и блок серверов */} - {serverId && ( - <> - {/* Выбор gateway в стиле карточек серверов */} -
-
-

Шлюз (gateway)

-
+ {/* Шлюз (gateway) — только при выбранном сервере */} + {serverId && ( + <> +
+
Шлюз (gateway)
+
{gatewaysForServer.length > 0 ? 'Выберите шлюз для привязки проверки (опционально). Можно искать по IP или интерфейсу ниже.' : 'Нет настроенных шлюзов для этого сервера. Проверка пойдёт без привязки к gateway.'}
-
-
{loading && !networkConfig ? (
Загрузка сетевых настроек…
) : ( <> {gatewaysForServer.length > 0 && ( -
- {gatewaysForServer .map((g) => { - const isSelected = gatewayRef === g.ip || gatewayRef === g.id; - const flag = g.country ? countryToFlag(g.country) : ''; - const subtitle = [g.country, g.provider].filter(Boolean).join(' · '); - return ( -
-
{ - const next = isSelected ? '' : (g.ip || g.id); - setGatewayRef(next); - if (!next) { - setGatewayMeta(null); - } else { - setGatewayMeta({ ip: g.ip, gateway: g }); - if (!target && g.ip) setTarget(g.ip); - } - }} - > -
- - {flag || (g.ip ? g.ip.slice(0, 2) : '?')} - -
-
- {g.ip || '—'} -
- {(g.description || g.ip) && ( -
- {g.description || g.ip} -
- )} -
- {subtitle || '—'} -
+
+ {gatewaysForServer.map((g) => { + const isSelected = gatewayRef === g.ip || gatewayRef === g.id; + const flag = g.country ? countryToFlag(g.country) : ''; + const subtitle = [g.country, g.provider].filter(Boolean).join(' · '); + return ( +
+
{ + const next = isSelected ? '' : (g.ip || g.id); + setGatewayRef(next); + if (!next) setGatewayMeta(null); + else { + setGatewayMeta({ ip: g.ip, gateway: g }); + if (!target && g.ip) setTarget(g.ip); + } + }} + > +
+ + {flag || (g.ip ? g.ip.slice(0, 2) : '?')} + +
+
+ {g.ip || '—'}
+ {(g.description || g.ip) && ( +
+ {g.description || g.ip} +
+ )} +
{subtitle || '—'}
- ); - })} +
+ ); + })}
)} -
+
Текущий gateway:  {gatewayRef || gatewayMeta?.ip || 'не выбран'}
)} -
-
- {/* Режим и кнопки запуска */} -
+ {/* Популярные цели — быстрый выбор таргета по логотипу */} +
+
Популярные цели
+
+ Клик по карточке подставит цель в поле «Домен или IP назначения». +
+
+ {POPULAR_TARGETS.map(({ id: tid, name, target: tgt, Icon, color }) => { + const isSelected = target === tgt; + const bgClass = color === 'red' ? 'bg-red-lt' : color === 'blue' ? 'bg-blue-lt' : 'bg-orange-lt'; + const textClass = color === 'red' ? 'text-red' : color === 'blue' ? 'text-blue' : 'text-orange'; + return ( +
+
setTarget(tgt)} + > +
+ + + +
+
{name}
+
{tgt}
+
+
+
+
+ ); + })} +
+ + )} +
+
+ + {/* Режим и кнопки запуска — только при выбранном сервере */} + {serverId && ( +
@@ -449,7 +479,6 @@ function MikrotikTools() {
- )} {/* Параметры проверки + результаты */}