diff --git a/frontend/src/ServerManager.jsx b/frontend/src/ServerManager.jsx index a85df52..4ea8667 100644 --- a/frontend/src/ServerManager.jsx +++ b/frontend/src/ServerManager.jsx @@ -1443,9 +1443,16 @@ function EditServerModal({ show, server, onChange, onSave, onClose }) { // Локальное состояние для формы const [localServer, setLocalServer] = useState(server || {}); + const ensureGateways = (srv) => { + if (!srv) return {}; + const needs = NEEDS_GATEWAYS(srv.type); + const gateways = needs ? normalizeGateways(srv.gateways, srv.gateway || srv.dns || srv.ip) : []; + return { ...srv, gateways }; + }; + // Синхронизируем локальное состояние с пропсами useEffect(() => { - setLocalServer(server || {}); + setLocalServer(ensureGateways(server || {})); }, [server]); useEffect(() => { @@ -1523,6 +1530,114 @@ function EditServerModal({ show, server, onChange, onSave, onClose }) { handleChange('tunnel', e.target.value)} /> + {NEEDS_GATEWAYS(localServer.type) && ( + <> +
Шлюзы
+
+ {(localServer.gateways || []).map((gw, idx) => ( +
+
+
+ + { + const list = (localServer.gateways || []).map((g, i) => i === idx ? { ...g, name: e.target.value } : g); + const next = { ...localServer, gateways: list }; + setLocalServer(next); + onChange && onChange(next); + }} + placeholder="GW-MSK" + required + /> +
+
+ + { + const list = (localServer.gateways || []).map((g, i) => i === idx ? { ...g, ip: e.target.value } : g); + const next = { ...localServer, gateways: list }; + setLocalServer(next); + onChange && onChange(next); + }} + placeholder="10.0.0.1" + /> +
+
+ + { + const list = (localServer.gateways || []).map((g, i) => i === idx ? { ...g, comment: e.target.value } : g); + const next = { ...localServer, gateways: list }; + setLocalServer(next); + onChange && onChange(next); + }} + placeholder="Основной шлюз" + /> +
+
+
+ { + const list = (localServer.gateways || []).map((g, i) => ({ ...g, primary: i === idx ? e.target.checked : false })); + if (!list.some(g => g.primary)) list[idx].primary = true; + const next = { ...localServer, gateways: list }; + setLocalServer(next); + onChange && onChange(next); + }} + title="Основной шлюз" + /> +
+
+
+
+
{gw.primary ? 'Основной шлюз' : 'Резервный шлюз'}
+ {(localServer.gateways || []).length > 1 && ( + + )} +
+
+ ))} +
+ +
Для jumphost/exit должен быть один основной gateway.
+ + )}