+ |
+
+
+ {item.asn}
+
+ |
{asnNameMap[item.asn] ? (
{asnNameMap[item.asn]}
@@ -699,10 +816,11 @@ function ASNsNewManager() {
onChange={setEditingValue}
communities={communities}
onKeyDown={(e) => handleEditKeyDown(e, item.asn)}
- className={`form-control d-inline-block w-auto me-2${isValidCommunity(editingValue) ? '' : ' is-invalid'}`}
+ className={`form-control d-inline-block me-2${isValidCommunity(editingValue) ? '' : ' is-invalid'}`}
+ style={{ width: '150px' }}
/>
-
-
+
+
>
) : (
<>
@@ -719,43 +837,55 @@ function ASNsNewManager() {
)}
{/* Пагинация */}
{totalPages > 1 && (
-
-
- Показано {((currentPage - 1) * pageSize) + 1} - {((currentPage - 1) * pageSize) + paginatedItems.length} из {totalItems || paginatedItems.length}
+
+
+
+ Показано {((currentPage - 1) * pageSize) + 1} - {((currentPage - 1) * pageSize) + paginatedItems.length} из {totalItems || filtered.length}
+
+
+ -
+
+
+ -
+
+
+ {(() => {
+ const pages = [];
+ let start = Math.max(1, currentPage - 2);
+ let end = Math.min(totalPages, currentPage + 2);
+ if (currentPage <= 3) end = Math.min(totalPages, 5);
+ if (currentPage >= totalPages - 2) start = Math.max(1, totalPages - 4);
+ if (start > 1) pages.push('start-ellipsis');
+ for (let p = start; p <= end; p++) pages.push(p);
+ if (end < totalPages) pages.push('end-ellipsis');
+ return pages.map((p) => (
+ p === 'start-ellipsis' || p === 'end-ellipsis' ? (
+ - …
+ ) : (
+ -
+
+
+ )
+ ));
+ })()}
+ -
+
+
+ -
+
+
+
-
- -
-
-
- -
-
-
- {(() => {
- const pages = [];
- let start = Math.max(1, currentPage - 2);
- let end = Math.min(totalPages, currentPage + 2);
- if (currentPage <= 3) end = Math.min(totalPages, 5);
- if (currentPage >= totalPages - 2) start = Math.max(1, totalPages - 4);
- if (start > 1) pages.push('start-ellipsis');
- for (let p = start; p <= end; p++) pages.push(p);
- if (end < totalPages) pages.push('end-ellipsis');
- return pages.map((p) => (
- p === 'start-ellipsis' || p === 'end-ellipsis' ? (
- - …
- ) : (
- -
-
-
- )
- ));
- })()}
- -
-
-
- -
-
-
-
)}
diff --git a/frontend/src/DomainsNewManager.jsx b/frontend/src/DomainsNewManager.jsx
index 91465a0..e17fe3f 100644
--- a/frontend/src/DomainsNewManager.jsx
+++ b/frontend/src/DomainsNewManager.jsx
@@ -18,7 +18,12 @@ import {
IconHash,
IconClock,
IconFileText,
- IconFilter
+ IconFilter,
+ IconWorld,
+ IconTrendingUp,
+ IconUsers,
+ IconArrowUp,
+ IconArrowDown
} from '@tabler/icons-react';
import TableSkeleton, { TableEmpty } from './components/TableSkeleton.jsx';
import PageHeader from './components/PageHeader.jsx';
@@ -530,12 +535,103 @@ function DomainsNewManager() {
/>
)}
/>
+
+ {/* Статистические карточки */}
+
+
+
+
+
+
+
+
+
+
+
+ Всего доменов
+
+ {items.length}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Отфильтровано
+
+ {filtered.length}
+ {filtered.length !== items.length && (
+
+ ({items.length - filtered.length} скрыто)
+
+ )}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Уникальных Community
+
+ {allCommunities.length}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Выбрано
+
+ {selectedDomains.size}
+ {selectedDomains.size > 0 && (
+
+ ({Math.round((selectedDomains.size / filtered.length) * 100)}%)
+
+ )}
+
+
+
+
+
+
+
+
- {/* Classic Add New Domain Card (restored) */}
+ {/* Classic Add New Domain Card (improved) */}
-
-
+
+
Добавить новый домен
@@ -543,47 +639,78 @@ function DomainsNewManager() {
|