feat: Enhance FilterManager to include filter copying functionality and improve user prompts for server configuration deployment
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 6m42s

This commit is contained in:
2025-07-14 12:01:54 +07:00
parent d059892d7e
commit 1869774f73
+37 -22
View File
@@ -136,18 +136,14 @@ function FilterManager() {
const handleSaveServerConfig = async (serverId) => {
try {
console.log('Starting to save server config for serverId:', serverId);
const config = await generateMikrotikConfig();
console.log('Generated config:', config);
// Проверяем, что конфигурация не пустая
if (!config || config === '// Сначала выберите сервер' || config === '// Нет фильтров для генерации конфигурации') {
setError('Нет данных для сохранения конфигурации. Убедитесь, что выбран сервер и есть фильтры.');
return;
}
console.log('Sending config to save:', { config });
await axios.post(`${API_URL}/server-configs/${serverId}`, { config });
setSuccess(`Конфигурация для сервера "${servers.find(s => s.id === serverId)?.name}" сохранена!`);
@@ -187,7 +183,7 @@ function FilterManager() {
}
const confirm = window.confirm(
`Скопировать конфигурацию с сервера "${sourceServer.name}" на ${targetServers.length} сервер(ов)?\n\n` +
`Скопировать конфигурацию и фильтры с сервера "${sourceServer.name}" на ${targetServers.length} сервер(ов)?\n\n` +
`Целевые серверы: ${targetServers.map(s => s.name).join(', ')}`
);
@@ -195,9 +191,13 @@ function FilterManager() {
setLoading(true);
try {
// Получаем фильтры исходного сервера
const sourceFiltersResponse = await axios.get(`${API_URL}/server-filters/${sourceServerId}`);
const sourceFilters = sourceFiltersResponse.data;
// Получаем конфигурацию исходного сервера
const sourceResponse = await axios.get(`${API_URL}/server-configs/${sourceServerId}`);
const sourceConfig = sourceResponse.data.config;
const sourceConfigResponse = await axios.get(`${API_URL}/server-configs/${sourceServerId}`);
const sourceConfig = sourceConfigResponse.data.config;
if (!sourceConfig || sourceConfig === '// Конфигурация не найдена') {
setError(`У сервера "${sourceServer.name}" нет сохраненной конфигурации.`);
@@ -206,13 +206,18 @@ function FilterManager() {
const results = [];
// Копируем конфигурацию на все целевые серверы
// Копируем фильтры и конфигурацию на все целевые серверы
for (const targetServer of targetServers) {
try {
// Копируем фильтры
await axios.post(`${API_URL}/server-filters/${targetServer.id}`, { filters: sourceFilters });
// Копируем конфигурацию
await axios.post(`${API_URL}/server-configs/${targetServer.id}`, { config: sourceConfig });
results.push({ server: targetServer.name, status: 'success' });
} catch (error) {
console.error(`Error copying config to ${targetServer.name}:`, error);
console.error(`Error copying to ${targetServer.name}:`, error);
results.push({ server: targetServer.name, status: 'error', error: error.message });
}
}
@@ -221,7 +226,12 @@ function FilterManager() {
const errorCount = results.filter(r => r.status === 'error').length;
if (errorCount === 0) {
setSuccess(`Конфигурация успешно скопирована на ${successCount} сервер(ов)!`);
setSuccess(`Конфигурация и фильтры успешно скопированы на ${successCount} сервер(ов)!`);
// Если текущий выбранный сервер был в списке копируемых, обновляем его фильтры
if (selectedServer && targetServers.some(s => s.id === selectedServer.id)) {
await fetchServerFilters(selectedServer.id);
}
} else {
setError(
`Копирование завершено с ошибками:\n` +
@@ -251,20 +261,25 @@ function FilterManager() {
};
const handleDeployToAllServers = async () => {
if (servers.length === 0) {
setError('Нет серверов для развертывания.');
if (!selectedServer) {
setError('Сначала выберите сервер с фильтрами для развертывания.');
return;
}
const enabledServers = servers.filter(s => s.enabled);
if (serverFilters.length === 0) {
setError('У выбранного сервера нет фильтров для развертывания.');
return;
}
const enabledServers = servers.filter(s => s.enabled && s.id !== selectedServer.id);
if (enabledServers.length === 0) {
setError('Нет включенных серверов для развертывания.');
setError('Нет других включенных серверов для развертывания.');
return;
}
const confirm = window.confirm(
`Вы уверены, что хотите развернуть конфигурацию на ${enabledServers.length} сервер(ов)?\n\n` +
`Серверы: ${enabledServers.map(s => s.name).join(', ')}`
`Развернуть фильтры и конфигурацию с сервера "${selectedServer.name}" на ${enabledServers.length} сервер(ов)?\n\n` +
`Целевые серверы: ${enabledServers.map(s => s.name).join(', ')}`
);
if (!confirm) return;
@@ -276,7 +291,12 @@ function FilterManager() {
for (const server of enabledServers) {
try {
// Копируем фильтры
await axios.post(`${API_URL}/server-filters/${server.id}`, { filters: serverFilters });
// Копируем конфигурацию
await axios.post(`${API_URL}/server-configs/${server.id}`, { config });
results.push({ server: server.name, status: 'success' });
} catch (error) {
console.error(`Error deploying to ${server.name}:`, error);
@@ -288,7 +308,7 @@ function FilterManager() {
const errorCount = results.filter(r => r.status === 'error').length;
if (errorCount === 0) {
setSuccess(`Конфигурация успешно развернута на ${successCount} сервер(ов)!`);
setSuccess(`Фильтры и конфигурация успешно развернуты на ${successCount} сервер(ов)!`);
} else {
setError(
`Развертывание завершено с ошибками:\n` +
@@ -396,15 +416,10 @@ function FilterManager() {
}
try {
console.log('Sending filters to generate config:', serverFilters);
console.log('Making request to:', `${API_URL}/server-filters/generate-config`);
const response = await axios.post(`${API_URL}/server-filters/generate-config`, {
filters: serverFilters
});
console.log('Response from generate-config:', response.data);
console.log('Response status:', response.status);
if (response.data && response.data.config) {
return response.data.config;
} else {