diff --git a/frontend/src/ASNsNewManager.jsx b/frontend/src/ASNsNewManager.jsx index da29805..37fa993 100644 --- a/frontend/src/ASNsNewManager.jsx +++ b/frontend/src/ASNsNewManager.jsx @@ -42,6 +42,7 @@ import Tooltip from './components/Tooltip.jsx'; import Pagination from './components/Pagination.jsx'; import AddItemModal from './components/AddItemModal.jsx'; import { getAsnName, getAsnNameSync } from './lib/asn.js'; +import LastSaved from './components/LastSaved.jsx'; const API_URL = '/api'; @@ -523,47 +524,39 @@ function ASNsNewManager() { } actions={( -
- - { if (!filterCommunity) { setError('Выберите community в фильтре для очистки'); return; } setClearCommunitiesOpen(true); }} - disableClearCommunities={items.length === 0 || !filterCommunity} - onSave={handleSaveChanges} - disableSave={loading} - onHistory={() => setHistoryOpen(true)} - onOnlineUpdate={() => setWsOpen(true)} - onBackgroundUpdate={async () => { - try { - const res = await fetch('/api/update-bgp/background', { method: 'POST' }); - const data = await res.json().catch(() => ({})); - if (!res.ok || data.ok === false) { - throw new Error(data?.message || `HTTP ${res.status}`); - } - notifyMutationSuccess('Фоновое обновление запущено', data); - } catch (e) { - window.notify?.error('Не удалось запустить фоновое обновление', String(e)); + { if (!filterCommunity) { setError('Выберите community в фильтре для очистки'); return; } setClearCommunitiesOpen(true); }} + disableClearCommunities={items.length === 0 || !filterCommunity} + onSave={handleSaveChanges} + disableSave={loading} + onHistory={() => setHistoryOpen(true)} + lastModified={lastModified} + onOnlineUpdate={() => setWsOpen(true)} + onBackgroundUpdate={async () => { + try { + const res = await fetch('/api/update-bgp/background', { method: 'POST' }); + const data = await res.json().catch(() => ({})); + if (!res.ok || data.ok === false) { + throw new Error(data?.message || `HTTP ${res.status}`); } - }} - /> -
+ notifyMutationSuccess('Фоновое обновление запущено', data); + } catch (e) { + window.notify?.error('Не удалось запустить фоновое обновление', String(e)); + } + }} + /> )} /> @@ -595,7 +588,7 @@ function ASNsNewManager() {

Список ASN {items.length}

-
+
)}
+
-
diff --git a/frontend/src/IPRangesManager.jsx b/frontend/src/IPRangesManager.jsx index 4f4458b..c7e35d7 100644 --- a/frontend/src/IPRangesManager.jsx +++ b/frontend/src/IPRangesManager.jsx @@ -43,6 +43,7 @@ import BulkActionsBar from './components/BulkActionsBar.jsx'; import Tooltip from './components/Tooltip.jsx'; import Pagination from './components/Pagination.jsx'; import AddItemModal from './components/AddItemModal.jsx'; +import LastSaved from './components/LastSaved.jsx'; const API_URL = '/api'; @@ -783,47 +784,39 @@ function IPRangesManager() { } actions={( -
- - { if (!filterCommunity) { setError('Выберите community в фильтре для очистки'); return; } setClearCommunitiesOpen(true); }} - disableClearCommunities={items.length === 0 || !filterCommunity} - onSave={handleSaveChanges} - disableSave={loading} - onHistory={() => setHistoryOpen(true)} - onOnlineUpdate={() => setWsOpen(true)} - onBackgroundUpdate={async () => { - try { - const res = await fetch('/api/update-bgp/background', { method: 'POST' }); - const data = await res.json().catch(() => ({})); - if (!res.ok || data.ok === false) { - throw new Error(data?.message || `HTTP ${res.status}`); - } - notifyMutationSuccess('Фоновое обновление запущено', data); - } catch (e) { - window.notify?.error('Не удалось запустить фоновое обновление', String(e)); + { if (!filterCommunity) { setError('Выберите community в фильтре для очистки'); return; } setClearCommunitiesOpen(true); }} + disableClearCommunities={items.length === 0 || !filterCommunity} + onSave={handleSaveChanges} + disableSave={loading} + onHistory={() => setHistoryOpen(true)} + lastModified={lastModified} + onOnlineUpdate={() => setWsOpen(true)} + onBackgroundUpdate={async () => { + try { + const res = await fetch('/api/update-bgp/background', { method: 'POST' }); + const data = await res.json().catch(() => ({})); + if (!res.ok || data.ok === false) { + throw new Error(data?.message || `HTTP ${res.status}`); } - }} - /> -
+ notifyMutationSuccess('Фоновое обновление запущено', data); + } catch (e) { + window.notify?.error('Не удалось запустить фоновое обновление', String(e)); + } + }} + /> )} /> @@ -855,7 +848,7 @@ function IPRangesManager() {

Список IP-диапазонов {items.length}

-
+
- - + + - +