From d929ac6477ca89bd70b683a22ba6ff84add525be Mon Sep 17 00:00:00 2001 From: rcourtman Date: Sat, 23 May 2026 13:43:56 +0100 Subject: [PATCH] Hide Backup column on non-Proxmox workload surfaces MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The workload table's Backup column reads exclusively from resource.proxmox.lastBackup (useWorkloads.ts line 486), which Proxmox VE populates from its built-in vzdump scheduler / PBS integration. No other adapter populates a backup field — vCenter has no native backup concept (third-party tools like Veeam own that), Docker / Podman / Kubernetes don't expose a workload-row "last backup" either. So the column rendered a permanently blank cell on every platform except Proxmox. This is structurally different from the earlier (wrong) instinct to hide DISK and Uptime on vSphere: those had real upstream sources (guest filesystem REST + PerformanceManager uptime counters) that were properly fixed by extending the backend adapter. Backup has no upstream source at this integration layer, so hiding it is the canonical product call rather than a stopgap. Hide by default on: - vSphere via VMWARE_WORKLOAD_DEFAULT_HIDDEN_COLUMN_IDS in VmwarePageSurface.tsx - Kubernetes via additionalDefaultHiddenColumnIds in KubernetesPageSurface.tsx - Docker / Podman / TrueNAS apps via the shared APP_CONTAINER_BASE_DEFAULT_HIDDEN_COLUMNS constant in appContainerColumns.ts (Docker test list updated to match) Proxmox keeps Backup visible by default since that's the only platform whose adapter populates the underlying field. Users on any platform can still toggle the column back on from the Columns menu. --- .../features/docker/__tests__/dockerPageModel.test.ts | 8 ++++---- .../src/features/kubernetes/KubernetesPageSurface.tsx | 5 +++++ .../src/features/platformPage/appContainerColumns.ts | 8 +++++++- .../src/features/vmware/VmwarePageSurface.tsx | 9 +++++++++ 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/frontend-modern/src/features/docker/__tests__/dockerPageModel.test.ts b/frontend-modern/src/features/docker/__tests__/dockerPageModel.test.ts index 9c3137049..6891add03 100644 --- a/frontend-modern/src/features/docker/__tests__/dockerPageModel.test.ts +++ b/frontend-modern/src/features/docker/__tests__/dockerPageModel.test.ts @@ -103,7 +103,7 @@ describe('dockerPageModel', () => { buildDockerContainerDefaultHiddenColumnIds([ makeResource({ id: 'ctr-1', type: 'app-container' }), ]), - ).toEqual(['disk', 'tags', 'netIo', 'diskIo']); + ).toEqual(['disk', 'tags', 'backup', 'netIo', 'diskIo']); }); it('keeps Docker container I/O columns default-visible once telemetry exists', () => { @@ -116,7 +116,7 @@ describe('dockerPageModel', () => { diskIO: { readRate: 0, writeRate: 0 }, }), ]), - ).toEqual(['disk', 'tags']); + ).toEqual(['disk', 'tags', 'backup']); }); it('decides Docker container network and disk I/O defaults independently', () => { @@ -128,7 +128,7 @@ describe('dockerPageModel', () => { network: { rxBytes: 128, txBytes: 64 }, }), ]), - ).toEqual(['disk', 'tags', 'diskIo']); + ).toEqual(['disk', 'tags', 'backup', 'diskIo']); expect( buildDockerContainerDefaultHiddenColumnIds([ @@ -138,7 +138,7 @@ describe('dockerPageModel', () => { diskIO: { readRate: 128, writeRate: 64 }, }), ]), - ).toEqual(['disk', 'tags', 'netIo']); + ).toEqual(['disk', 'tags', 'backup', 'netIo']); }); it('builds host-identity badges for Docker workload group rows', () => { diff --git a/frontend-modern/src/features/kubernetes/KubernetesPageSurface.tsx b/frontend-modern/src/features/kubernetes/KubernetesPageSurface.tsx index 06c530473..e4f8c8948 100644 --- a/frontend-modern/src/features/kubernetes/KubernetesPageSurface.tsx +++ b/frontend-modern/src/features/kubernetes/KubernetesPageSurface.tsx @@ -109,6 +109,11 @@ function KubernetesOverview(props: KubernetesOverviewProps) { suppressPlatformFilter: true, allowEmbeddedScopeFilters: true, columnVisibilityStorageScope: KUBERNETES_WORKLOAD_COLUMN_SCOPE, + // Backup column is driven exclusively by Proxmox vzdump / PBS data + // (`resource.proxmox.lastBackup` in useWorkloads); Kubernetes + // workloads have no equivalent source at this integration layer, so + // the column would always render blank. Hide by default. + additionalDefaultHiddenColumnIds: ['backup'], compactGroupHeaders: true, }); const showSharedFilterToolbar = createMemo( diff --git a/frontend-modern/src/features/platformPage/appContainerColumns.ts b/frontend-modern/src/features/platformPage/appContainerColumns.ts index 6df63fb74..1880cec12 100644 --- a/frontend-modern/src/features/platformPage/appContainerColumns.ts +++ b/frontend-modern/src/features/platformPage/appContainerColumns.ts @@ -1,6 +1,12 @@ import type { Resource } from '@/types/resource'; -export const APP_CONTAINER_BASE_DEFAULT_HIDDEN_COLUMNS = ['disk', 'tags'] as const; +// Default-hidden columns for app-container workloads. `disk` and `tags` are +// existing hides; `backup` is added because the workload-table Backup column +// is driven exclusively by `resource.proxmox.lastBackup`, which Proxmox VE +// populates from its vzdump scheduler / PBS integration. App containers +// (Docker, Podman, TrueNAS apps) have no equivalent source — the cell is +// not just empty, the concept doesn't exist at this integration layer. +export const APP_CONTAINER_BASE_DEFAULT_HIDDEN_COLUMNS = ['disk', 'tags', 'backup'] as const; export const APP_CONTAINER_COLUMN_LABEL_OVERRIDES = { disk: 'Writable layer', diff --git a/frontend-modern/src/features/vmware/VmwarePageSurface.tsx b/frontend-modern/src/features/vmware/VmwarePageSurface.tsx index ea574a34f..b0f15e1c4 100644 --- a/frontend-modern/src/features/vmware/VmwarePageSurface.tsx +++ b/frontend-modern/src/features/vmware/VmwarePageSurface.tsx @@ -46,6 +46,14 @@ const VALID_TABS = new Set(VMWARE_TAB_SPECS.map((tab) => tab.id const VMWARE_PLATFORM_FILTER = 'vmware-vsphere'; const VMWARE_WORKLOAD_STATUS_STORAGE_SCOPE = 'vmware'; const VMWARE_WORKLOAD_COLUMN_VISIBILITY_SCOPE = 'vmware-vms'; +// Backup column on the workload table is driven exclusively by Proxmox +// vzdump / PBS data (`resource.proxmox.lastBackup` in useWorkloads). +// vCenter has no native backup concept — vSphere backups happen in +// third-party products (Veeam, Commvault, Rubrik, Cohesity, Dell +// PowerProtect) or VMware's separately-licensed Live Recovery / SRM, +// none of which surface through vCenter's inventory API. Hide the +// column by default rather than render a permanently blank cell. +const VMWARE_WORKLOAD_DEFAULT_HIDDEN_COLUMN_IDS: readonly string[] = ['backup']; const VMWARE_WORKLOAD_STATUS_OPTIONS: readonly WorkloadsStatusOption[] = [ { value: 'all', label: 'All' }, { value: 'running', label: 'Powered on' }, @@ -233,6 +241,7 @@ function VmwareOverview(props: VmwareOverviewProps) { allowEmbeddedScopeFilters: true, statusModeStorageScope: VMWARE_WORKLOAD_STATUS_STORAGE_SCOPE, columnVisibilityStorageScope: VMWARE_WORKLOAD_COLUMN_VISIBILITY_SCOPE, + additionalDefaultHiddenColumnIds: [...VMWARE_WORKLOAD_DEFAULT_HIDDEN_COLUMN_IDS], compactGroupHeaders: true, groupNodeDrawerMode: 'disabled', metricDisplayMode: props.metricDisplayMode,