diff --git a/frontend/src/FilterManager.jsx b/frontend/src/FilterManager.jsx index c9e736a..147caec 100644 --- a/frontend/src/FilterManager.jsx +++ b/frontend/src/FilterManager.jsx @@ -35,6 +35,33 @@ import { const API_URL = '/api'; +// Нормализация шлюзов (аналог из ServerManager) +const normalizeGateways = (gateways = [], fallbackName = '') => { + if (!Array.isArray(gateways)) return []; + const cleaned = gateways + .map((g, idx) => ({ + id: g?.id || `${Date.now()}-${idx}`, + name: String(g?.name || '').trim(), + ip: String(g?.ip || '').trim(), + comment: String(g?.comment || '').trim(), + primary: Boolean(g?.primary), + })) + .filter(g => g.name || g.ip || g.comment); + if (cleaned.length === 0) { + return [{ id: `${Date.now()}-primary`, name: fallbackName || 'gateway', ip: '', comment: '', primary: true }]; + } + let hasPrimary = false; + cleaned.forEach((g) => { + if (g.primary && !hasPrimary) { + hasPrimary = true; + } else { + g.primary = false; + } + }); + if (!hasPrimary) cleaned[0].primary = true; + return cleaned; +}; + const countryToFlag = (code) => { if (!code || typeof code !== 'string') return ''; const cc = code.trim().toUpperCase(); @@ -121,6 +148,9 @@ function FilterManager() { // Communities directory for autocomplete const [communities, setCommunities] = useState([]); + // Inventory servers (from /servers endpoint) + const [inventoryServers, setInventoryServers] = useState([]); + useEffect(() => { (async () => { try { @@ -130,6 +160,15 @@ function FilterManager() { // мягко игнорируем, автокомплит необязателен } })(); + // Загружаем инвентарь серверов для отображения флагов и IP + (async () => { + try { + const res = await api.get(`/servers`); + setInventoryServers(Array.isArray(res.data) ? res.data : []); + } catch (e) { + // мягко игнорируем, дополнительная информация необязательна + } + })(); }, []); const filterKey = (f) => {