Snapshots: Hide the share button (#77763)

This commit is contained in:
Ryan McKinley
2023-11-08 11:23:50 -08:00
committed by GitHub
parent 4b5310dae7
commit dc4aa3e0f6
6 changed files with 64 additions and 39 deletions

View File

@@ -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<VizPanel>;
dashboardRef: SceneObjectRef<DashboardScene>;
@@ -70,9 +65,9 @@ export class ShareSnapshotTab extends SceneObjectBase<ShareSnapshotTabState> {
}
private _onActivate() {
getBackendSrv()
.get('/api/snapshot/shared-options')
.then((shareOptions: SnapshotSharingOptions) => {
getDashboardSnapshotSrv()
.getSharingOptions()
.then((shareOptions) => {
if (this.isActive) {
this.setState({
snapshotSharingOptions: shareOptions,

View File

@@ -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<Props, State> {
}
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,
});
}

View File

@@ -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<DashboardDataDTO> } {
_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) {

View File

@@ -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<Snapshot[]>;
getSharingOptions: () => Promise<SnapshotSharingOptions>;
deleteSnapshot: (key: string) => Promise<void>;
getSnapshot: (key: string) => Promise<DashboardDTO>;
}
const legacyDashboardSnapshotSrv: DashboardSnapshotSrv = {
getSnapshots: () => getBackendSrv().get<Snapshot[]>('/api/dashboard/snapshots'),
getSharingOptions: () => getBackendSrv().get<SnapshotSharingOptions>('/api/snapshot/shared-options'),
deleteSnapshot: (key: string) => getBackendSrv().delete('/api/snapshots/' + key),
getSnapshot: async (key: string) => {
const dto = await getBackendSrv().get<DashboardDTO>('/api/snapshots/' + key);
dto.meta.canShare = false;
return dto;
},
};
export function getDashboardSnapshotSrv(): DashboardSnapshotSrv {
return legacyDashboardSnapshotSrv;
}

View File

@@ -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);
});

View File

@@ -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;