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}
-
-
-