diff --git a/frontend/src/AutoUrlManager.jsx b/frontend/src/AutoUrlManager.jsx
index 717262b..d79e437 100644
--- a/frontend/src/AutoUrlManager.jsx
+++ b/frontend/src/AutoUrlManager.jsx
@@ -13,6 +13,11 @@ import {
IconCircleCheck,
IconCopy
} from '@tabler/icons-react';
+import PageHeader from './components/PageHeader.jsx';
+import PageHeaderActions from './components/PageHeaderActions.jsx';
+import TableSkeleton, { TableEmpty } from './components/TableSkeleton.jsx';
+import EmptyState from './components/EmptyState.jsx';
+import ImportModal from './components/ImportModal.jsx';
function AutoUrlManager() {
const [urls, setUrls] = useState([]);
@@ -22,6 +27,7 @@ function AutoUrlManager() {
const [message, setMessage] = useState('');
const [messageType, setMessageType] = useState('');
const [touched, setTouched] = useState({});
+ const [importOpen, setImportOpen] = useState(false);
useEffect(() => {
fetchUrls();
@@ -45,6 +51,10 @@ function AutoUrlManager() {
setUrls([...urls, { url: '', community: '' }]);
};
+ const clearEmptyRows = () => {
+ setUrls(urls.filter(u => u != null && (u.url || u.community)));
+ };
+
const removeUrl = (index) => {
setUrls(urls.filter((_, i) => i !== index));
};
@@ -144,24 +154,83 @@ function AutoUrlManager() {
}
};
- if (loading) {
- return (
-
- );
- }
-
return (
-
-
-
-
Автоматические URL
-
Управление автоматическими URL-адресами для загрузки списков IP и доменов
+
+
+
+
+
+
+
+
+
+
-
-
+ )}
+ />
{message && (
@@ -174,53 +243,36 @@ function AutoUrlManager() {
)}
-
-
URL-адреса для автоматической загрузки
-
-
-
-
-
-
-
- {urls.length === 0 ? (
-
-
-
Нет добавленных URL-адресов
-
-
+ {loading ? (
+
+ ) : urls.length === 0 ? (
+
+
+ Добавить первый URL
+
+ )}
+ secondaryAction={(
+
+ )}
+ />
) : (
@@ -299,49 +351,8 @@ function AutoUrlManager() {
Всего URL-адресов: {urls.length}
)}
-
-
-
-
+
+ Введите http/https URL и числовой community. Не валидные поля подсвечиваются.
@@ -405,6 +416,25 @@ function AutoUrlManager() {
+
+ {/* Модальное окно импорта */}
+ {
+ const [u, c] = String(line).split(/\s+/);
+ return { url: u || '', community: c || '' };
+ }}
+ validateItem={(obj) => Boolean(obj?.url) && Boolean(obj?.community)}
+ onConfirm={(items) => {
+ setUrls(prev => [...prev, ...items]);
+ setImportOpen(false);
+ }}
+ onClose={() => setImportOpen(false)}
+ />
);
}