Hide Backup column on non-Proxmox workload surfaces

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.
This commit is contained in:
rcourtman
2026-05-23 13:43:56 +01:00
parent 973cdab880
commit d929ac6477
4 changed files with 25 additions and 5 deletions
@@ -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', () => {
@@ -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(
@@ -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',
@@ -46,6 +46,14 @@ const VALID_TABS = new Set<VmwarePageTabId>(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,