diff --git a/public/app/features/dashboard/api/UnifiedDashboardAPI.ts b/public/app/features/dashboard/api/UnifiedDashboardAPI.ts index 5e63cedb0f5..4ef67e9da06 100644 --- a/public/app/features/dashboard/api/UnifiedDashboardAPI.ts +++ b/public/app/features/dashboard/api/UnifiedDashboardAPI.ts @@ -1,7 +1,7 @@ import { Dashboard } from '@grafana/schema'; import { Spec as DashboardV2Spec } from '@grafana/schema/dist/esm/schema/dashboard/v2'; import { isResource } from 'app/features/apiserver/guards'; -import { Resource, ResourceList } from 'app/features/apiserver/types'; +import { ListOptions, Resource, ResourceList } from 'app/features/apiserver/types'; import { DashboardDataDTO, DashboardDTO } from 'app/types/dashboard'; import { SaveDashboardCommand } from '../components/SaveDashboard/types'; @@ -56,6 +56,13 @@ export class UnifiedDashboardAPI return await this.v1Client.deleteDashboard(uid, showSuccessAlert); } + async listDashboardHistory(uid: string) { + return this.listAcrossVersions({ + labelSelector: 'grafana.app/get-history=true', + fieldSelector: `metadata.name=${uid}`, + }); + } + /** * List deleted dashboards handling mixed v1/v2 versions or pure v2 dashboards. * @@ -68,14 +75,25 @@ export class UnifiedDashboardAPI async listDeletedDashboards( options: ListDeletedDashboardsOptions ): Promise> { - const v1Response = await this.v1Client.listDeletedDashboards(options); + return this.listAcrossVersions(options); + } + + /** + * Steps: + * 1. Call v1 client to get all deleted dashboards + * 2. Check if any items have failed conversion from v2 versions + * 3. If v2 dashboards are detected, call v2 client + * 4. Filter and combine v1 and v2 dashboards into one response + */ + private async listAcrossVersions(options: ListOptions): Promise> { + const v1Response = await this.v1Client.client.list(options); const filteredV1Items = v1Response.items.filter((item) => !failedFromVersion(item, ['v2'])); if (filteredV1Items.length === v1Response.items.length) { return v1Response; } - const v2Response = await this.v2Client.listDeletedDashboards(options); + const v2Response = await this.v2Client.client.list(options); const filteredV2Items = v2Response.items.filter((item) => !failedFromVersion(item, ['v0', 'v1'])); return { diff --git a/public/app/features/dashboard/api/v1.ts b/public/app/features/dashboard/api/v1.ts index aba4042bfca..9618540b1be 100644 --- a/public/app/features/dashboard/api/v1.ts +++ b/public/app/features/dashboard/api/v1.ts @@ -36,7 +36,7 @@ export const K8S_V1_DASHBOARD_API_CONFIG = { }; export class K8sDashboardAPI implements DashboardAPI { - private client: ResourceClient; + client: ResourceClient; constructor() { this.client = new ScopedResourceClient(K8S_V1_DASHBOARD_API_CONFIG); diff --git a/public/app/features/dashboard/api/v2.ts b/public/app/features/dashboard/api/v2.ts index 834faf8d152..36effc614f9 100644 --- a/public/app/features/dashboard/api/v2.ts +++ b/public/app/features/dashboard/api/v2.ts @@ -35,7 +35,7 @@ export const K8S_V2_DASHBOARD_API_CONFIG = { export class K8sDashboardV2API implements DashboardAPI | DashboardDTO, DashboardV2Spec> { - private client: ResourceClient; + client: ResourceClient; constructor() { this.client = new ScopedResourceClient(K8S_V2_DASHBOARD_API_CONFIG); diff --git a/public/app/features/manage-dashboards/utils/validation.test.ts b/public/app/features/manage-dashboards/utils/validation.test.ts index e955f7a732f..0eab12da834 100644 --- a/public/app/features/manage-dashboards/utils/validation.test.ts +++ b/public/app/features/manage-dashboards/utils/validation.test.ts @@ -49,6 +49,7 @@ describe('validateUid', () => { saveDashboard: jest.fn(), listDeletedDashboards: jest.fn(), restoreDashboard: jest.fn(), + listDashboardHistory: jest.fn(), }, v2: { getDashboardDTO: jest.fn().mockResolvedValue(v2Dashboard), @@ -56,6 +57,7 @@ describe('validateUid', () => { saveDashboard: jest.fn(), listDeletedDashboards: jest.fn(), restoreDashboard: jest.fn(), + listDashboardHistory: jest.fn(), }, }); });