From bf4b1b155420d4bedc4a43a8ce61f73d7b2d3eff Mon Sep 17 00:00:00 2001 From: shats Date: Mon, 1 Dec 2025 15:57:53 +0700 Subject: [PATCH] feat: Enhance ServerManager component by adding optional external and internal IP fields, improving server addition and editing functionality, and updating validation messages for better user experience. --- frontend/src/ServerManager.jsx | 108 ++++++++++++++++++++++++++++++--- 1 file changed, 98 insertions(+), 10 deletions(-) diff --git a/frontend/src/ServerManager.jsx b/frontend/src/ServerManager.jsx index 0885fe5..629cc1b 100644 --- a/frontend/src/ServerManager.jsx +++ b/frontend/src/ServerManager.jsx @@ -31,7 +31,10 @@ const API_URL = '/api'; function ServerManager() { const [servers, setServers] = useState([]); const [newServer, setNewServer] = useState({ + id: '', ip: '', + extIp: '', + internalIp: '', dns: '', country: '', provider: '', @@ -132,12 +135,27 @@ function ServerManager() { const handleAddServer = () => { if (!newServer.ip.trim() || !newServer.dns.trim() || !newServer.country.trim() || !newServer.provider.trim() || !newServer.tunnel.trim()) { - setError('Все поля должны быть заполнены.'); + setError('Все обязательные поля должны быть заполнены.'); return; } setError(''); - setServers([...servers, { ...newServer }]); - setNewServer({ ip: '', dns: '', country: '', provider: '', tunnel: 'GRE' }); + const nextId = `srv-${servers.length + 1}`; + const serverToAdd = { + ...newServer, + id: newServer.id || nextId, + }; + setServers([...servers, serverToAdd]); + setNewServer({ + id: '', + ip: '', + extIp: '', + internalIp: '', + dns: '', + country: '', + provider: '', + tunnel: 'GRE', + gateway: '' + }); }; // Функции для модального окна добавления сервера @@ -147,14 +165,24 @@ function ServerManager() { const handleCloseAddServerModal = () => { setAddServerModalOpen(false); - setNewServer({ ip: '', dns: '', country: '', provider: '', tunnel: 'GRE' }); + setNewServer({ + id: '', + ip: '', + extIp: '', + internalIp: '', + dns: '', + country: '', + provider: '', + tunnel: 'GRE', + gateway: '' + }); setCustomProvider(''); setError(''); }; const handleAddServerFromModal = () => { if (!newServer.ip.trim() || !newServer.dns.trim() || !newServer.country.trim() || !newServer.provider.trim() || !newServer.tunnel.trim() || !newServer.gateway.trim()) { - setError('Все поля должны быть заполнены.'); + setError('Все обязательные поля должны быть заполнены.'); return; } @@ -168,10 +196,25 @@ function ServerManager() { // Используем customProvider если выбран "Другой" const finalProvider = newServer.provider === 'Другой' ? customProvider : newServer.provider; - const serverToAdd = { ...newServer, provider: finalProvider }; + const nextId = `srv-${servers.length + 1}`; + const serverToAdd = { + ...newServer, + provider: finalProvider, + id: newServer.id || nextId, + }; setServers([...servers, serverToAdd]); - setNewServer({ ip: '', dns: '', country: '', provider: '', tunnel: 'GRE' }); + setNewServer({ + id: '', + ip: '', + extIp: '', + internalIp: '', + dns: '', + country: '', + provider: '', + tunnel: 'GRE', + gateway: '' + }); setCustomProvider(''); setAddServerModalOpen(false); setSuccess('Сервер успешно добавлен!'); @@ -188,7 +231,11 @@ function ServerManager() { }; const handleEditModalSave = (updatedServer) => { - setServers(servers.map(s => s.ip === updatedServer.ip ? { ...updatedServer } : s)); + setServers(servers.map(s => { + const sameId = s.id && updatedServer.id ? s.id === updatedServer.id : false; + const sameIp = s.ip === updatedServer.ip; + return (sameId || sameIp) ? { ...s, ...updatedServer } : s; + })); setEditModalOpen(false); setEditModalServer(null); }; @@ -276,9 +323,12 @@ function ServerManager() { .filter(s => (!filterCountry || s.country === filterCountry)) .filter(s => (!filterProvider || s.provider === filterProvider)); const csvContent = [ - ['IP', 'DNS', 'Country', 'Provider', 'Tunnel', 'Generated URL'], + ['ID', 'IP', 'Ext IP', 'Internal IP', 'DNS', 'Country', 'Provider', 'Tunnel', 'Generated URL'], ...filtered.map(server => [ + server.id || '', server.ip, + server.extIp || '', + server.internalIp || '', server.dns, server.country, server.provider, @@ -570,6 +620,12 @@ function ServerManager() { )} + + Внешний IP + + + Внутренний IP + handleSort('dns')}> DNS имя {sortField === 'dns' && ( @@ -620,8 +676,10 @@ function ServerManager() { Ничего не найдено. Измените фильтры или поиск. ) : paginatedServers.map((server) => ( - + {server.ip} + {server.extIp || } + {server.internalIp || } {server.dns} {countryToFlag(server.country)} {server.country} {server.provider} @@ -761,6 +819,24 @@ function ServerManager() { helpText="Введите IPv4 адрес сервера" /> + setNewServer({ ...newServer, extIp: val })} + placeholder="Публичный IP, если отличается" + icon={IconServer} + /> + + setNewServer({ ...newServer, internalIp: val })} + placeholder="10.x.x.x / 192.168.x.x" + icon={IconServer} + /> +
{ e.preventDefault(); onSave && onSave(localServer); }}> +
+ + handleChange('id', e.target.value)} placeholder="srv-1" /> +
handleChange('ip', e.target.value)} />
+
+ + handleChange('extIp', e.target.value)} placeholder="публичный IP, если отличается" /> +
+
+ + handleChange('internalIp', e.target.value)} placeholder="10.x.x.x / 192.168.x.x" /> +
handleChange('dns', e.target.value)} />