From dc4aa3e0f6a80949856cc307137ec6dae6556ed4 Mon Sep 17 00:00:00 2001 From: Ryan McKinley Date: Wed, 8 Nov 2023 11:23:50 -0800 Subject: [PATCH] Snapshots: Hide the share button (#77763) --- .../sharing/ShareSnapshotTab.tsx | 13 ++---- .../components/ShareModal/ShareSnapshot.tsx | 7 ++-- .../dashboard/services/DashboardLoaderSrv.ts | 19 ++++----- .../dashboard/services/SnapshotSrv.ts | 40 +++++++++++++++++++ .../components/SnapshotListTable.tsx | 13 +++--- .../app/features/manage-dashboards/types.ts | 11 ----- 6 files changed, 64 insertions(+), 39 deletions(-) create mode 100644 public/app/features/dashboard/services/SnapshotSrv.ts diff --git a/public/app/features/dashboard-scene/sharing/ShareSnapshotTab.tsx b/public/app/features/dashboard-scene/sharing/ShareSnapshotTab.tsx index 6edda573637..2a1e79dd8f1 100644 --- a/public/app/features/dashboard-scene/sharing/ShareSnapshotTab.tsx +++ b/public/app/features/dashboard-scene/sharing/ShareSnapshotTab.tsx @@ -8,6 +8,7 @@ import { Button, ClipboardButton, Field, Input, Modal, RadioButtonGroup } from ' import { t, Trans } from 'app/core/internationalization'; import { trackDashboardSharingActionPerType } from 'app/features/dashboard/components/ShareModal/analytics'; import { shareDashboardType } from 'app/features/dashboard/components/ShareModal/utils'; +import { getDashboardSnapshotSrv, SnapshotSharingOptions } from 'app/features/dashboard/services/SnapshotSrv'; import { DashboardScene } from '../scene/DashboardScene'; import { transformSceneToSaveModel, trimDashboardForSnapshot } from '../serialization/transformSceneToSaveModel'; @@ -39,12 +40,6 @@ const getExpireOptions = () => { ]; }; -type SnapshotSharingOptions = { - externalEnabled: boolean; - externalSnapshotName: string; - externalSnapshotURL: string; - snapshotEnabled: boolean; -}; export interface ShareSnapshotTabState extends SceneShareTabState { panelRef?: SceneObjectRef; dashboardRef: SceneObjectRef; @@ -70,9 +65,9 @@ export class ShareSnapshotTab extends SceneObjectBase { } private _onActivate() { - getBackendSrv() - .get('/api/snapshot/shared-options') - .then((shareOptions: SnapshotSharingOptions) => { + getDashboardSnapshotSrv() + .getSharingOptions() + .then((shareOptions) => { if (this.isActive) { this.setState({ snapshotSharingOptions: shareOptions, diff --git a/public/app/features/dashboard/components/ShareModal/ShareSnapshot.tsx b/public/app/features/dashboard/components/ShareModal/ShareSnapshot.tsx index d0f7b3baa8f..3b9f0bbf74a 100644 --- a/public/app/features/dashboard/components/ShareModal/ShareSnapshot.tsx +++ b/public/app/features/dashboard/components/ShareModal/ShareSnapshot.tsx @@ -8,6 +8,7 @@ import { getTimeSrv } from 'app/features/dashboard/services/TimeSrv'; import { DashboardModel, PanelModel } from 'app/features/dashboard/state'; import { VariableRefresh } from '../../../variables/types'; +import { getDashboardSnapshotSrv } from '../../services/SnapshotSrv'; import { trackDashboardSharingActionPerType } from './analytics'; import { ShareModalTabProps } from './types'; @@ -74,10 +75,10 @@ export class ShareSnapshot extends PureComponent { } async getSnaphotShareOptions() { - const shareOptions = await getBackendSrv().get('/api/snapshot/shared-options'); + const shareOptions = await getDashboardSnapshotSrv().getSharingOptions(); this.setState({ - sharingButtonText: shareOptions['externalSnapshotName'], - externalEnabled: shareOptions['externalEnabled'], + sharingButtonText: shareOptions.externalSnapshotName, + externalEnabled: shareOptions.externalEnabled, }); } diff --git a/public/app/features/dashboard/services/DashboardLoaderSrv.ts b/public/app/features/dashboard/services/DashboardLoaderSrv.ts index c55aa2f99de..c18012b452a 100644 --- a/public/app/features/dashboard/services/DashboardLoaderSrv.ts +++ b/public/app/features/dashboard/services/DashboardLoaderSrv.ts @@ -9,18 +9,16 @@ import impressionSrv from 'app/core/services/impression_srv'; import kbn from 'app/core/utils/kbn'; import { getDashboardScenePageStateManager } from 'app/features/dashboard-scene/pages/DashboardScenePageStateManager'; import { getDatasourceSrv } from 'app/features/plugins/datasource_srv'; -import { DashboardDataDTO, DashboardDTO, DashboardMeta } from 'app/types'; +import { DashboardDTO } from 'app/types'; import { appEvents } from '../../../core/core'; import { getDashboardSrv } from './DashboardSrv'; +import { getDashboardSnapshotSrv } from './SnapshotSrv'; export class DashboardLoaderSrv { constructor() {} - _dashboardLoadFailed( - title: string, - snapshot?: boolean - ): { meta: DashboardMeta; dashboard: Partial } { + _dashboardLoadFailed(title: string, snapshot?: boolean): DashboardDTO { snapshot = snapshot || false; return { meta: { @@ -29,9 +27,10 @@ export class DashboardLoaderSrv { canDelete: false, canSave: false, canEdit: false, + canShare: false, dashboardNotFound: true, }, - dashboard: { title }, + dashboard: { title, uid: title, schemaVersion: 0 }, }; } @@ -42,9 +41,11 @@ export class DashboardLoaderSrv { if (type === 'script' && slug) { promise = this._loadScriptedDashboard(slug); } else if (type === 'snapshot' && slug) { - promise = backendSrv.get('/api/snapshots/' + slug).catch(() => { - return this._dashboardLoadFailed('Snapshot not found', true); - }); + promise = getDashboardSnapshotSrv() + .getSnapshot(slug) + .catch(() => { + return this._dashboardLoadFailed('Snapshot not found', true); + }); } else if (type === 'ds' && slug) { promise = this._loadFromDatasource(slug); // explore dashboards as code } else if (type === 'public' && uid) { diff --git a/public/app/features/dashboard/services/SnapshotSrv.ts b/public/app/features/dashboard/services/SnapshotSrv.ts new file mode 100644 index 00000000000..293d5245fa3 --- /dev/null +++ b/public/app/features/dashboard/services/SnapshotSrv.ts @@ -0,0 +1,40 @@ +import { getBackendSrv } from '@grafana/runtime'; +import { DashboardDTO } from 'app/types'; + +// Used in the snapshot list +export interface Snapshot { + key: string; + name: string; + external: boolean; + externalUrl?: string; + url?: string; +} + +export interface SnapshotSharingOptions { + externalEnabled: boolean; + externalSnapshotName: string; + externalSnapshotURL: string; + snapshotEnabled: boolean; +} + +export interface DashboardSnapshotSrv { + getSnapshots: () => Promise; + getSharingOptions: () => Promise; + deleteSnapshot: (key: string) => Promise; + getSnapshot: (key: string) => Promise; +} + +const legacyDashboardSnapshotSrv: DashboardSnapshotSrv = { + getSnapshots: () => getBackendSrv().get('/api/dashboard/snapshots'), + getSharingOptions: () => getBackendSrv().get('/api/snapshot/shared-options'), + deleteSnapshot: (key: string) => getBackendSrv().delete('/api/snapshots/' + key), + getSnapshot: async (key: string) => { + const dto = await getBackendSrv().get('/api/snapshots/' + key); + dto.meta.canShare = false; + return dto; + }, +}; + +export function getDashboardSnapshotSrv(): DashboardSnapshotSrv { + return legacyDashboardSnapshotSrv; +} diff --git a/public/app/features/manage-dashboards/components/SnapshotListTable.tsx b/public/app/features/manage-dashboards/components/SnapshotListTable.tsx index 843a37b17e6..d909eba9e82 100644 --- a/public/app/features/manage-dashboards/components/SnapshotListTable.tsx +++ b/public/app/features/manage-dashboards/components/SnapshotListTable.tsx @@ -1,15 +1,14 @@ import React, { useState, useCallback } from 'react'; import useAsync from 'react-use/lib/useAsync'; -import { getBackendSrv, config } from '@grafana/runtime'; +import { config } from '@grafana/runtime'; import { ConfirmModal, Button, LinkButton } from '@grafana/ui'; import { Trans } from 'app/core/internationalization'; - -import { Snapshot } from '../types'; +import { getDashboardSnapshotSrv, Snapshot } from 'app/features/dashboard/services/SnapshotSrv'; export function getSnapshots() { - return getBackendSrv() - .get('/api/dashboard/snapshots') + return getDashboardSnapshotSrv() + .getSnapshots() .then((result: Snapshot[]) => { return result.map((snapshot) => ({ ...snapshot, @@ -29,8 +28,8 @@ export const SnapshotListTable = () => { async (snapshot: Snapshot) => { const filteredSnapshots = snapshots.filter((ss) => ss.key !== snapshot.key); setSnapshots(filteredSnapshots); - await getBackendSrv() - .delete(`/api/snapshots/${snapshot.key}`) + await getDashboardSnapshotSrv() + .deleteSnapshot(snapshot.key) .catch(() => { setSnapshots(snapshots); }); diff --git a/public/app/features/manage-dashboards/types.ts b/public/app/features/manage-dashboards/types.ts index a7f5a974920..f68c3fef98f 100644 --- a/public/app/features/manage-dashboards/types.ts +++ b/public/app/features/manage-dashboards/types.ts @@ -2,17 +2,6 @@ import { Dashboard } from '@grafana/schema/src/veneer/dashboard.types'; import { ExternalDashboard } from '../dashboard/components/DashExportModal/DashboardExporter'; -export interface Snapshot { - created: string; - expires: string; - external: boolean; - externalUrl: string; - key: string; - name: string; - updated: string; - url?: string; -} - export type DeleteDashboardResponse = { id: number; message: string;