diff --git a/frontend/src/NetworkConfigManager.jsx b/frontend/src/NetworkConfigManager.jsx index 55db589..d3782f4 100644 --- a/frontend/src/NetworkConfigManager.jsx +++ b/frontend/src/NetworkConfigManager.jsx @@ -718,25 +718,20 @@ function NetworkConfigManager() { }; // === Копирование кода MikroTik === - const handleCopyMikrotikCode = async () => { - // Объединяем все блоки в одну строку для копирования - const fullCode = Array.isArray(generatedMikrotikCode) && generatedMikrotikCode.length > 0 - ? generatedMikrotikCode.map(block => block.code).join('\n\n') - : ''; - - if (!fullCode) { + const handleCopyMikrotikCode = async (codeToCopy) => { + if (!codeToCopy) { notify.error('Нет кода для копирования'); return; } try { if (navigator.clipboard && navigator.clipboard.writeText) { - await navigator.clipboard.writeText(fullCode); + await navigator.clipboard.writeText(codeToCopy); notify.success('Код скопирован в буфер обмена!'); } else { // Fallback для старых браузеров const textArea = document.createElement('textarea'); - textArea.value = fullCode; + textArea.value = codeToCopy; textArea.style.position = 'fixed'; textArea.style.left = '-999999px'; document.body.appendChild(textArea); @@ -756,6 +751,40 @@ function NetworkConfigManager() { } }; + // === Группировка блоков по серверам === + const groupedMikrotikCode = useMemo(() => { + if (!Array.isArray(generatedMikrotikCode) || generatedMikrotikCode.length === 0) { + return {}; + } + + const grouped = {}; + generatedMikrotikCode.forEach(block => { + const serverName = block.serverName || '__unknown__'; + if (!grouped[serverName]) { + grouped[serverName] = { + server: block.server, + serverName: serverName, + blocks: [] + }; + } + grouped[serverName].blocks.push(block); + }); + + return grouped; + }, [generatedMikrotikCode]); + + // === Получение названия типа блока === + const getBlockTypeLabel = (type) => { + switch (type) { + case 'recursive-routes': + return 'Рекурсивные маршруты'; + case 'interface-addresses': + return 'IP адреса интерфейсов'; + default: + return 'Конфигурация'; + } + }; + // === Получение цвета провайдера === const getProviderColor = (provider) => { if (!provider) return 'secondary'; @@ -820,7 +849,7 @@ function NetworkConfigManager() { {/* Items */}
{iface.localIp || '—'}
- {iface.localIp && (
+ {displayLocalIp}
+ {displayLocalIp && displayLocalIp !== '—' && (