From ce62dad84410ab6123b1207f89c878fc13c1354d Mon Sep 17 00:00:00 2001 From: shats Date: Wed, 27 Aug 2025 13:30:43 +0700 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BC=D0=B5=D0=BD=D0=B5=D0=B4=D0=B6=D0=B5=D1=80?= =?UTF-8?q?=D1=8B=20ASNs,=20Domains=20=D0=B8=20IPRanges=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D0=B8?= =?UTF-8?q?=20=D1=81=D0=B5=D1=80=D0=B2=D0=B5=D1=80=D0=BD=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=BF=D0=B0=D0=B3=D0=B8=D0=BD=D0=B0=D1=86=D0=B8=D0=B8=20=D0=B8?= =?UTF-8?q?=20=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B5=D0=BD=D0=BD=D0=BE=D0=B9?= =?UTF-8?q?=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D0=BE=D0=B2=20=D1=81=20?= =?UTF-8?q?=D1=83=D1=87=D0=B5=D1=82=D0=BE=D0=BC=20=D1=84=D0=B8=D0=BB=D1=8C?= =?UTF-8?q?=D1=82=D1=80=D0=BE=D0=B2=20=D0=B8=20=D0=BF=D0=BE=D0=B8=D1=81?= =?UTF-8?q?=D0=BA=D0=B0;=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20=D1=81=D0=BE=D1=81=D1=82=D0=BE=D1=8F=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20totalItems=20=D0=B4=D0=BB=D1=8F=20=D0=BE=D1=82=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BE=D0=B1=D1=89?= =?UTF-8?q?=D0=B5=D0=B3=D0=BE=20=D0=BA=D0=BE=D0=BB=D0=B8=D1=87=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=B2=D0=B0=20=D1=8D=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/ASNsNewManager.jsx | 26 ++++++++++++++----------- frontend/src/DomainsNewManager.jsx | 31 +++++++++++++++++------------- frontend/src/IPRangesManager.jsx | 26 ++++++++++++++----------- 3 files changed, 48 insertions(+), 35 deletions(-) diff --git a/frontend/src/ASNsNewManager.jsx b/frontend/src/ASNsNewManager.jsx index f48f29d..28d8651 100644 --- a/frontend/src/ASNsNewManager.jsx +++ b/frontend/src/ASNsNewManager.jsx @@ -45,6 +45,7 @@ function ASNsNewManager() { const [showDeleteModal, setShowDeleteModal] = useState(false); const [itemToDelete, setItemToDelete] = useState(null); const [currentPage, setCurrentPage] = useState(1); + const [totalItems, setTotalItems] = useState(0); const [sortField, setSortField] = useState('asn'); const [sortOrder, setSortOrder] = useState('asc'); const [filterCommunity, setFilterCommunity] = useState(''); @@ -100,11 +101,14 @@ function ASNsNewManager() { const fetchItems = async () => { setLoading(true); try { - const response = await api.get(`/asns`, { params: { offset: 0, limit: 0 } }); - const payload = Array.isArray(response.data?.items) ? response.data.items : (Array.isArray(response.data) ? response.data : []); + const effectiveQ = searchTerm ? searchTerm : (filterCommunity ? filterCommunity : ''); + const response = await api.get(`/asns`, { params: { q: effectiveQ, offset: Math.max(0, (currentPage - 1) * pageSize), limit: pageSize, format: 'std' } }); + const payload = Array.isArray(response.data?.items) ? response.data.items : []; + const total = Number(response.data?.total ?? (Array.isArray(response.data) ? response.data.length : 0)); const mapped = payload.map(item => ({ asn: item.domain, community: item.type })); setItems(mapped); setOriginalItems(mapped); + setTotalItems(Number.isFinite(total) ? total : 0); setEtag(response.headers?.etag || ''); setLastModified(response.headers?.['last-modified'] || ''); const lengthHeader = response.headers?.['content-length-source']; @@ -118,6 +122,11 @@ function ASNsNewManager() { } }; + useEffect(() => { + fetchItems(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [currentPage, searchTerm, filterCommunity]); + const handleAddItem = () => { const asnOk = isValidAsn(newItem.asn); const communityOk = isValidCommunity(newItem.community); @@ -327,14 +336,9 @@ function ASNsNewManager() { ? sortedItems.filter(i => i.community === filterCommunity) : sortedItems; - // Поиск - const filteredItems = filteredByCommunity.filter(i => - i.asn.toLowerCase().includes(searchTerm.toLowerCase()) - ); - - // Пагинация - const totalPages = Math.ceil(filteredItems.length / pageSize); - const paginatedItems = filteredItems.slice((currentPage - 1) * pageSize, currentPage * pageSize); + // Пагинация теперь серверная + const paginatedItems = filteredByCommunity; + const totalPages = Math.max(1, Math.ceil((totalItems || paginatedItems.length) / pageSize)); // Для фильтра - список всех уникальных community const allCommunities = Array.from(new Set(items.map(i => i.community))); @@ -589,7 +593,7 @@ function ASNsNewManager() { {totalPages > 1 && (
- Показано {((currentPage - 1) * pageSize) + 1} - {Math.min(currentPage * pageSize, filteredItems.length)} из {filteredItems.length} + Показано {((currentPage - 1) * pageSize) + 1} - {((currentPage - 1) * pageSize) + paginatedItems.length} из {totalItems || paginatedItems.length}