From 0134bf88a293533238c097e583da4ff7565430a1 Mon Sep 17 00:00:00 2001 From: rcourtman Date: Fri, 26 Dec 2025 09:43:01 +0000 Subject: [PATCH] feat: Add copy uninstall button to Managed Agents table Users can now copy the uninstall command from the Actions column of any registered agent, without needing to start the token creation flow. Related to #914 --- .../src/components/Backups/UnifiedBackups.tsx | 94 +++++++++++++++++++ .../src/components/Settings/UnifiedAgents.tsx | 33 +++++-- 2 files changed, 121 insertions(+), 6 deletions(-) diff --git a/frontend-modern/src/components/Backups/UnifiedBackups.tsx b/frontend-modern/src/components/Backups/UnifiedBackups.tsx index b82807bcbc..898642bd28 100644 --- a/frontend-modern/src/components/Backups/UnifiedBackups.tsx +++ b/frontend-modern/src/components/Backups/UnifiedBackups.tsx @@ -56,6 +56,28 @@ const UnifiedBackups: Component = () => { const pbsBackupsState = createMemo(() => state.backups?.pbs ?? state.pbsBackups); const pmgBackupsState = createMemo(() => state.backups?.pmg ?? state.pmgBackups); const [searchTerm, setSearchTerm] = createSignal(''); + + // PBS enhancement banner: Check if user has PBS storage via PVE passthrough but no direct PBS connection + const [pbsBannerDismissed, setPbsBannerDismissed] = createLocalStorageBooleanSignal( + 'pulse.pbsEnhancementBannerDismissed', + false + ); + + // Detect PBS storage accessed via PVE passthrough (storage.type === 'pbs') + const hasPBSViaPassthrough = createMemo(() => { + const storageList = state.storage || []; + return storageList.some((s) => s.type === 'pbs'); + }); + + // Check if user has direct PBS instances configured + const hasDirectPBS = createMemo(() => { + return (state.pbs || []).length > 0; + }); + + // Show banner if: PBS via passthrough exists, no direct PBS, and not dismissed + const showPBSEnhancementBanner = createMemo(() => { + return hasPBSViaPassthrough() && !hasDirectPBS() && !pbsBannerDismissed(); + }); const [selectedNode, setSelectedNode] = createSignal(null); const [typeFilter, setTypeFilter] = createSignal<'all' | FilterableGuestType>('all'); const [backupTypeFilter, setBackupTypeFilter] = createSignal<'all' | BackupType>('all'); @@ -1143,6 +1165,69 @@ const UnifiedBackups: Component = () => { searchTerm={searchTerm()} /> + {/* PBS Enhancement Banner - shown when PBS storage exists via PVE but no direct PBS connection */} + +
+ +
+
+ + + + +
+
+

+ Get more from your PBS backups +

+

+ You're viewing PBS backups through your PVE connection. Add your PBS server directly to unlock: +

+
    +
  • + + + + Deduplication factor and storage efficiency stats +
  • +
  • + + + + PBS server health monitoring (CPU, memory, uptime) +
  • +
  • + + + + Sync, verify, prune, and GC job status +
  • +
+ +
+
+
+
+ {/* Removed old PBS table */} 0}> @@ -2152,6 +2237,15 @@ const UnifiedBackups: Component = () => { ? 'PVE' : 'PBS'} + {/* Data source indicator for PBS via passthrough */} + + + via PVE + + { {agent.lastSeen ? formatRelativeTime(agent.lastSeen) : '—'} - +
+ + +
)}