diff --git a/frontend/src/components/server/ServerModal.jsx b/frontend/src/components/server/ServerModal.jsx index d4c3aa4..f77ad30 100644 --- a/frontend/src/components/server/ServerModal.jsx +++ b/frontend/src/components/server/ServerModal.jsx @@ -11,20 +11,8 @@ import { } from '../../utils/serverUtils.js'; /** - * Списки стран и провайдеров + * Список провайдеров */ -const COUNTRY_OPTIONS = [ - { value: '', label: 'Выберите страну', disabled: true }, - { value: 'RU', label: 'Россия (RU)' }, - { value: 'SWE', label: 'Швеция (SWE)' }, - { value: 'FI', label: 'Финляндия (FI)' }, - { value: 'US', label: 'США (US)' }, - { value: 'DE', label: 'Германия (DE)' }, - { value: 'NL', label: 'Нидерланды (NL)' }, - { value: 'SE', label: 'Швеция (SE)' }, - { value: 'SG', label: 'Сингапур (SG)' }, -]; - const PROVIDER_OPTIONS = [ { value: '', label: 'Выберите провайдера', disabled: true }, { value: 'Yandex', label: 'Yandex Cloud' }, @@ -154,53 +142,6 @@ function ServerModal({ show, mode = 'add', server, onSave, onClose, error: exter setLocalServer(prev => ({ ...prev, [field]: value })); }; - /** - * Обработчики для gateways - */ - const handleGatewayChange = (idx, field, value) => { - setLocalServer(prev => { - const currentGateways = Array.isArray(prev.gateways) ? prev.gateways : []; - const updatedGateways = currentGateways.map((gw, i) => - i === idx ? { ...gw, [field]: value } : gw - ); - return { ...prev, gateways: updatedGateways }; - }); - }; - - const handlePrimaryChange = (idx, checked) => { - setLocalServer(prev => { - const currentGateways = Array.isArray(prev.gateways) ? prev.gateways : []; - const updatedGateways = currentGateways.map((gw, i) => ({ - ...gw, - primary: i === idx ? checked : false - })); - if (!updatedGateways.some(g => g.primary) && updatedGateways.length > 0) { - updatedGateways[idx].primary = true; - } - return { ...prev, gateways: updatedGateways }; - }); - }; - - const handleAddGateway = () => { - setLocalServer(prev => { - const currentGateways = Array.isArray(prev.gateways) ? prev.gateways : []; - const newGw = makeGateway({ primary: currentGateways.length === 0 }); - return { ...prev, gateways: [...currentGateways, newGw] }; - }); - }; - - const handleRemoveGateway = (idx) => { - setLocalServer(prev => { - const currentGateways = Array.isArray(prev.gateways) ? prev.gateways : []; - if (currentGateways.length <= 1) return prev; - const updatedGateways = currentGateways.filter((_, i) => i !== idx); - if (!updatedGateways.some(g => g.primary) && updatedGateways.length > 0) { - updatedGateways[0].primary = true; - } - return { ...prev, gateways: updatedGateways }; - }); - }; - /** * Валидация и сохранение */ @@ -236,14 +177,13 @@ function ServerModal({ show, mode = 'add', server, onSave, onClose, error: exter return; } - // Валидация gateways для jumphost/exit + // Шлюзы для jumphost/exit задаются в другом месте (network-config); при сохранении передаём существующие или один по умолчанию const needsGws = NEEDS_GATEWAYS(localServer.type); let finalGateways = []; if (needsGws) { finalGateways = normalizeGateways(localServer.gateways, localServer.gateway || localServer.dns || localServer.ip); if (finalGateways.length === 0) { - setInternalError('Добавьте хотя бы один шлюз'); - return; + finalGateways = [makeGateway({ primary: true, name: localServer.dns?.split('.')[0] || 'main' })]; } } @@ -256,9 +196,6 @@ function ServerModal({ show, mode = 'add', server, onSave, onClose, error: exter onSave && onSave(serverToSave); }; - const currentGateways = Array.isArray(localServer.gateways) ? localServer.gateways : []; - const showGateways = NEEDS_GATEWAYS(localServer.type); - return (
@@ -367,26 +304,24 @@ function ServerModal({ show, mode = 'add', server, onSave, onClose, error: exter />
- {/* Страна */} + {/* Страна — 2-буквенный код как в интерфейсах */}
- + />
+
2-буквенный код страны (ISO 3166-1 alpha-2)
{/* Провайдер */} @@ -477,116 +412,8 @@ function ServerModal({ show, mode = 'add', server, onSave, onClose, error: exter
)} - {/* Основной шлюз (текстовое поле для совместимости) */} -
- - handleFieldChange('gateway', e.target.value)} - placeholder="Cloudflare, Hetzner и т.д." - /> -
- Используйте секцию "Шлюзы" ниже для более детальной настройки -
-
- {/* Секция шлюзов */} - {showGateways && ( -
-
- - -
- -
- {currentGateways.map((gw, idx) => ( -
-
-
- - handleGatewayChange(idx, 'name', e.target.value)} - placeholder="GW-MSK" - required - /> -
-
- - handleGatewayChange(idx, 'ip', e.target.value)} - placeholder="10.0.0.1" - /> -
-
- - handleGatewayChange(idx, 'comment', e.target.value)} - placeholder="Описание" - /> -
-
-
- handlePrimaryChange(idx, e.target.checked)} - id={`primary-${gw.id || idx}`} - /> - -
-
-
- {currentGateways.length > 1 && ( - - )} -
-
-
- {gw.primary ? 'Основной шлюз' : 'Резервный шлюз'} -
-
- ))} -
- -
- Для типов jumphost/exit должен быть минимум один шлюз с признаком "Основной" -
-
- )} - {/* MikroTik RouterOS API — для jumphost и домашних (входных) роутеров */} {(localServer.type === 'jumphost' || localServer.type === 'home') && (