diff --git a/pkg/sbombastic-image-vulnerability-scanner/components/RegistryDetails.vue b/pkg/sbombastic-image-vulnerability-scanner/components/RegistryDetails.vue index 6d2ccf6..ac10cad 100644 --- a/pkg/sbombastic-image-vulnerability-scanner/components/RegistryDetails.vue +++ b/pkg/sbombastic-image-vulnerability-scanner/components/RegistryDetails.vue @@ -24,6 +24,13 @@ {{ t('imageScanner.general.refresh') }} + @@ -36,6 +43,7 @@ import { BadgeState } from '@rancher/components'; import { PRODUCT_NAME, RESOURCE, PAGE } from '@sbombastic-image-vulnerability-scanner/types'; import ResourceTable from "@shell/components/ResourceTable"; + import ActionMenu from '@shell/components/ActionMenuShell.vue'; import RancherMeta from './common/RancherMeta.vue'; import RegisterStatusBadge from './common/RegisterStatusBadge.vue'; import RegistryDetailScanTable from './RegistryDetailScanTable.vue'; @@ -49,13 +57,15 @@ RancherMeta, RegisterStatusBadge, RegistryDetailScanTable, - ScanButton + ScanButton, + ActionMenu }, data() { return { PRODUCT_NAME, RESOURCE, PAGE, + registry: null, registryStatus: null, registryMetadata: [], scanHistory: [], @@ -103,7 +113,7 @@ }, { type: 'text', - value: registry.metadata.schedule || '', + value: registry.spec.scanInterval || '', } ]; @@ -122,6 +132,7 @@ } }) }); + this.registry = registry; }, getRegistryStatus(registry) { if (!registry || !registry.status || !registry.status.conditions || !registry.status.conditions.length) { @@ -217,6 +228,17 @@ display: flex; align-items: center; gap: 16px; + + &:deep() button[data-testid="masthead-action-menu"] { + border-radius: 4px; + width: 35px; + height: 40px; + + display: inline-flex; + flex-direction: row; + justify-content: center; + align-items: center; + } } } } diff --git a/pkg/sbombastic-image-vulnerability-scanner/config/table-headers.ts b/pkg/sbombastic-image-vulnerability-scanner/config/table-headers.ts index 88720e4..2e944e7 100644 --- a/pkg/sbombastic-image-vulnerability-scanner/config/table-headers.ts +++ b/pkg/sbombastic-image-vulnerability-scanner/config/table-headers.ts @@ -65,7 +65,7 @@ export const REGISTRY_SCAN_HISTORY_TABLE = [ labelKey: "imageScanner.registries.configuration.scanTable.header.status", value: "status.statusResult.type", formatter: "RegistryStatusCellBadge", - sort: "status", + sort: "status.statusResult.type", width: 100, }, { @@ -73,13 +73,13 @@ export const REGISTRY_SCAN_HISTORY_TABLE = [ labelKey: "imageScanner.registries.configuration.scanTable.header.since", value: "status.statusResult.lastTransitionTime", formatter: "Date", - sort: "timestamp", + sort: "status.statusResult.lastTransitionTime:desc", }, { name: "progress", labelKey: "imageScanner.registries.configuration.scanTable.header.progress", getValue: (row: any) => row, - formatter: "ProgressCell", + formatter: "Progress", sort: "progress", }, { @@ -87,14 +87,14 @@ export const REGISTRY_SCAN_HISTORY_TABLE = [ labelKey: "imageScanner.registries.configuration.scanTable.header.imagesScanned", value: "status.scannedImagesCount", - sort: "imagesScanned", + sort: "status.scannedImagesCount", }, { name: "imagesFound", labelKey: "imageScanner.registries.configuration.scanTable.header.imagesFound", value: "status.imagesCount", - sort: "imagesFound", + sort: "status.imagesCount", }, { name: "errors", @@ -133,7 +133,7 @@ export const VEX_MANAGEMENT_TABLE = [ labelKey: "imageScanner.vexManagement.table.headers.createdBy", value: (row: any) => { const gen = Number(row?.metadata?.generation); - return (gen === 1) ? 'Rancher' : 'Manual entry'; + return gen === 1 ? "Rancher" : "Manual entry"; }, sort: "metadata.generation", }, diff --git a/pkg/sbombastic-image-vulnerability-scanner/models/sbombastic.rancher.io.registry.js b/pkg/sbombastic-image-vulnerability-scanner/models/sbombastic.rancher.io.registry.js index fae1199..ae0b95a 100644 --- a/pkg/sbombastic-image-vulnerability-scanner/models/sbombastic.rancher.io.registry.js +++ b/pkg/sbombastic-image-vulnerability-scanner/models/sbombastic.rancher.io.registry.js @@ -7,6 +7,11 @@ export default class Registry extends SteveModel { console.log("Registry _availableActions"); const out = super._availableActions.filter(action => !['download','downloadYaml'].includes(action.action)); + // In details page, we don't want to show the scan action + if (this.$rootState.targetRoute && 'id' in this.$rootState.targetRoute.params) { + return out; + } + const scanAction = { action: 'scanRegistry', label: this.t('imageScanner.registries.button.startScan'),