From 53bf828797d682962c8dc733785653ab8ce068b3 Mon Sep 17 00:00:00 2001 From: shats Date: Sun, 7 Dec 2025 01:54:50 +0700 Subject: [PATCH] feat: Implement gateway normalization and inventory server loading in FilterManager, enhancing gateway management and improving server configuration reliability. --- frontend/src/FilterManager.jsx | 39 ++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) 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) => {