diff --git a/frontend/src/FilterManager.jsx b/frontend/src/FilterManager.jsx index 57882a6..2c43cbf 100644 --- a/frontend/src/FilterManager.jsx +++ b/frontend/src/FilterManager.jsx @@ -55,6 +55,14 @@ function FilterManager() { const [editingServer, setEditingServer] = useState(null); const [editServerError, setEditServerError] = useState(''); + // Новое состояние для режима + const [mode, setMode] = useState('simple'); // 'simple' | 'advanced' + const [simpleFilters, setSimpleFilters] = useState([]); + const [simpleAddFilter, setSimpleAddFilter] = useState({ community: '', gateway: '', description: '' }); + const [simpleError, setSimpleError] = useState(''); + const [simpleSuccess, setSimpleSuccess] = useState(''); + const [simpleLoading, setSimpleLoading] = useState(false); + useEffect(() => { fetchServers(); }, []); @@ -542,6 +550,55 @@ function FilterManager() { const enabledServers = servers.filter(s => s.enabled).length; const serversWithFilters = servers.filter(s => s.id === selectedServer?.id ? serverFilters.length > 0 : false).length; + // Функция для применения фильтров из упрощённого режима на все сервера + const handleDeploySimpleFiltersToAll = async () => { + if (servers.length === 0) { + setSimpleError('Нет серверов для применения фильтров.'); + return; + } + if (simpleFilters.length === 0) { + setSimpleError('Нет фильтров для применения.'); + return; + } + setSimpleLoading(true); + try { + // Копируем фильтры и генерируем конфиг для каждого сервера + for (const server of servers) { + await axios.post(`${API_URL}/server-filters/${server.id}`, { filters: simpleFilters }); + // Генерируем конфиг + const response = await axios.post(`${API_URL}/server-filters/generate-config`, { filters: simpleFilters }); + if (response.data && response.data.config) { + await axios.post(`${API_URL}/server-configs/${server.id}`, { config: response.data.config }); + } + } + setSimpleSuccess('Фильтры и конфигурация успешно применены ко всем серверам!'); + setTimeout(() => setSimpleSuccess(''), 4000); + } catch (error) { + setSimpleError('Ошибка при применении фильтров: ' + (error.response?.data || error.message)); + } finally { + setSimpleLoading(false); + } + }; + + // Функции для работы с фильтрами в упрощённом режиме + const handleSimpleAddFilter = () => { + if (!simpleAddFilter.community.trim() || !simpleAddFilter.gateway.trim()) { + setSimpleError('Поля Community и Gateway должны быть заполнены.'); + return; + } + setSimpleFilters([...simpleFilters, { ...simpleAddFilter }]); + setSimpleAddFilter({ community: '', gateway: '', description: '' }); + setSimpleError(''); + }; + const handleSimpleDeleteFilter = (filter) => { + setSimpleFilters(simpleFilters.filter(f => f !== filter)); + }; + const handleSimpleEditFilter = (index, field, value) => { + const updated = [...simpleFilters]; + updated[index][field] = value; + setSimpleFilters(updated); + }; + return (
@@ -1098,6 +1155,123 @@ function FilterManager() {
)} + + {/* Модальное окно упрощённого режима */} + {mode === 'simple' && ( +
+
+
+
+
Упрощённый режим управления фильтрами
+ +
+
+ {simpleError && ( +
{simpleError}
+ )} + {simpleSuccess && ( +
{simpleSuccess}
+ )} +
+ + + + + + + + + + + {simpleFilters.length === 0 ? ( + + ) : ( + simpleFilters.map((filter, idx) => ( + + + + + + + )) + )} + +
COMMUNITYGATEWAYОПИСАНИЕДЕЙСТВИЯ
Нет фильтров
+ handleSimpleEditFilter(idx, 'community', e.target.value)} + /> + + handleSimpleEditFilter(idx, 'gateway', e.target.value)} + /> + + handleSimpleEditFilter(idx, 'description', e.target.value)} + /> + + +
+
+
+
+ setSimpleAddFilter({ ...simpleAddFilter, community: e.target.value })} + /> +
+
+ setSimpleAddFilter({ ...simpleAddFilter, gateway: e.target.value })} + /> +
+
+ setSimpleAddFilter({ ...simpleAddFilter, description: e.target.value })} + /> +
+
+ +
+
+ +
+
+ +
+
+
+
+ )} ); }