From bb5c5f38db3fdeb21e7e3f354238e133bc5e9737 Mon Sep 17 00:00:00 2001 From: Juan Cabanas Date: Mon, 25 Mar 2024 16:37:00 -0300 Subject: [PATCH] Scenes: Add reporting tab in share modal (#85086) --- .../dashboard-scene/sharing/ShareExportTab.tsx | 4 +--- .../sharing/ShareLibraryPanelTab.tsx | 2 -- .../dashboard-scene/sharing/ShareLinkTab.tsx | 2 -- .../features/dashboard-scene/sharing/ShareModal.tsx | 13 ++++++++++++- .../dashboard-scene/sharing/SharePanelEmbedTab.tsx | 1 - .../dashboard-scene/sharing/ShareSnapshotTab.tsx | 2 -- .../public-dashboards/SharePublicDashboardTab.tsx | 9 ++------- .../app/features/dashboard-scene/sharing/types.ts | 3 +++ 8 files changed, 18 insertions(+), 18 deletions(-) diff --git a/public/app/features/dashboard-scene/sharing/ShareExportTab.tsx b/public/app/features/dashboard-scene/sharing/ShareExportTab.tsx index 542e6d9c788..979ad00acec 100644 --- a/public/app/features/dashboard-scene/sharing/ShareExportTab.tsx +++ b/public/app/features/dashboard-scene/sharing/ShareExportTab.tsx @@ -3,14 +3,13 @@ import React from 'react'; import { useAsync } from 'react-use'; import AutoSizer from 'react-virtualized-auto-sizer'; -import { SceneComponentProps, SceneObjectBase, SceneObjectRef } from '@grafana/scenes'; +import { SceneComponentProps, SceneObjectBase } from '@grafana/scenes'; import { Button, ClipboardButton, CodeEditor, Field, Modal, Switch, VerticalGroup } from '@grafana/ui'; import { t, Trans } from 'app/core/internationalization'; import { DashboardExporter } from 'app/features/dashboard/components/DashExportModal'; import { shareDashboardType } from 'app/features/dashboard/components/ShareModal/utils'; import { DashboardModel } from 'app/features/dashboard/state'; -import { DashboardScene } from '../scene/DashboardScene'; import { transformSceneToSaveModel } from '../serialization/transformSceneToSaveModel'; import { DashboardInteractions } from '../utils/interactions'; @@ -19,7 +18,6 @@ import { SceneShareTabState } from './types'; const exportExternallyTranslation = t('share-modal.export.share-externally-label', `Export for sharing externally`); interface ShareExportTabState extends SceneShareTabState { - dashboardRef: SceneObjectRef; isSharingExternally?: boolean; isViewingJSON?: boolean; } diff --git a/public/app/features/dashboard-scene/sharing/ShareLibraryPanelTab.tsx b/public/app/features/dashboard-scene/sharing/ShareLibraryPanelTab.tsx index 989e1f79d33..601d2e3b31c 100644 --- a/public/app/features/dashboard-scene/sharing/ShareLibraryPanelTab.tsx +++ b/public/app/features/dashboard-scene/sharing/ShareLibraryPanelTab.tsx @@ -7,14 +7,12 @@ import { shareDashboardType } from 'app/features/dashboard/components/ShareModal import { DashboardModel, PanelModel } from 'app/features/dashboard/state'; import { DashboardGridItem } from '../scene/DashboardGridItem'; -import { DashboardScene } from '../scene/DashboardScene'; import { gridItemToPanel, transformSceneToSaveModel } from '../serialization/transformSceneToSaveModel'; import { SceneShareTabState } from './types'; export interface ShareLibraryPanelTabState extends SceneShareTabState { panelRef?: SceneObjectRef; - dashboardRef: SceneObjectRef; } export class ShareLibraryPanelTab extends SceneObjectBase { diff --git a/public/app/features/dashboard-scene/sharing/ShareLinkTab.tsx b/public/app/features/dashboard-scene/sharing/ShareLinkTab.tsx index a41f4dc2808..21a739717a0 100644 --- a/public/app/features/dashboard-scene/sharing/ShareLinkTab.tsx +++ b/public/app/features/dashboard-scene/sharing/ShareLinkTab.tsx @@ -11,14 +11,12 @@ import { createShortLink } from 'app/core/utils/shortLinks'; import { ThemePicker } from 'app/features/dashboard/components/ShareModal/ThemePicker'; import { shareDashboardType } from 'app/features/dashboard/components/ShareModal/utils'; -import { DashboardScene } from '../scene/DashboardScene'; import { DashboardInteractions } from '../utils/interactions'; import { getDashboardUrl } from '../utils/urlBuilders'; import { SceneShareTabState } from './types'; export interface ShareLinkTabState extends SceneShareTabState, ShareOptions { panelRef?: SceneObjectRef; - dashboardRef: SceneObjectRef; } interface ShareOptions { diff --git a/public/app/features/dashboard-scene/sharing/ShareModal.tsx b/public/app/features/dashboard-scene/sharing/ShareModal.tsx index b1046d45dcd..9e20b3a6a17 100644 --- a/public/app/features/dashboard-scene/sharing/ShareModal.tsx +++ b/public/app/features/dashboard-scene/sharing/ShareModal.tsx @@ -18,7 +18,7 @@ import { ShareLinkTab } from './ShareLinkTab'; import { SharePanelEmbedTab } from './SharePanelEmbedTab'; import { ShareSnapshotTab } from './ShareSnapshotTab'; import { SharePublicDashboardTab } from './public-dashboards/SharePublicDashboardTab'; -import { ModalSceneObjectLike, SceneShareTab } from './types'; +import { ModalSceneObjectLike, SceneShareTab, SceneShareTabState } from './types'; interface ShareModalState extends SceneObjectState { dashboardRef: SceneObjectRef; @@ -27,6 +27,13 @@ interface ShareModalState extends SceneObjectState { activeTab: string; } +type customDashboardTabType = new (...args: SceneShareTabState[]) => SceneShareTab; +const customDashboardTabs: customDashboardTabType[] = []; + +export function addDashboardShareTab(tab: customDashboardTabType) { + customDashboardTabs.push(tab); +} + /** * Used for full dashboard share modal and the panel level share modal */ @@ -67,6 +74,10 @@ export class ShareModal extends SceneObjectBase implements Moda } } + if (!panelRef) { + tabs.push(...customDashboardTabs.map((Tab) => new Tab({ dashboardRef }))); + } + if (isPublicDashboardsEnabled()) { tabs.push(new SharePublicDashboardTab({ dashboardRef, modalRef: this.getRef() })); } diff --git a/public/app/features/dashboard-scene/sharing/SharePanelEmbedTab.tsx b/public/app/features/dashboard-scene/sharing/SharePanelEmbedTab.tsx index ce6e7391eb5..1b5cf04dbc6 100644 --- a/public/app/features/dashboard-scene/sharing/SharePanelEmbedTab.tsx +++ b/public/app/features/dashboard-scene/sharing/SharePanelEmbedTab.tsx @@ -15,7 +15,6 @@ import { SceneShareTabState } from './types'; export interface SharePanelEmbedTabState extends SceneShareTabState { panelRef: SceneObjectRef; - dashboardRef: SceneObjectRef; } export class SharePanelEmbedTab extends SceneObjectBase { diff --git a/public/app/features/dashboard-scene/sharing/ShareSnapshotTab.tsx b/public/app/features/dashboard-scene/sharing/ShareSnapshotTab.tsx index 7fae7cf1635..bd733ecbd65 100644 --- a/public/app/features/dashboard-scene/sharing/ShareSnapshotTab.tsx +++ b/public/app/features/dashboard-scene/sharing/ShareSnapshotTab.tsx @@ -9,7 +9,6 @@ import { t, Trans } from 'app/core/internationalization'; 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'; import { DashboardInteractions } from '../utils/interactions'; @@ -44,7 +43,6 @@ const getDefaultExpireOption = () => { export interface ShareSnapshotTabState extends SceneShareTabState { panelRef?: SceneObjectRef; - dashboardRef: SceneObjectRef; snapshotName?: string; selectedExpireOption?: SelectableValue; diff --git a/public/app/features/dashboard-scene/sharing/public-dashboards/SharePublicDashboardTab.tsx b/public/app/features/dashboard-scene/sharing/public-dashboards/SharePublicDashboardTab.tsx index 0a5a3ec1cec..311652d5fb8 100644 --- a/public/app/features/dashboard-scene/sharing/public-dashboards/SharePublicDashboardTab.tsx +++ b/public/app/features/dashboard-scene/sharing/public-dashboards/SharePublicDashboardTab.tsx @@ -1,23 +1,18 @@ import React from 'react'; -import { SceneComponentProps, SceneObjectBase, SceneObjectRef } from '@grafana/scenes'; +import { SceneComponentProps, SceneObjectBase } from '@grafana/scenes'; import { t } from 'app/core/internationalization'; import { useGetPublicDashboardQuery } from 'app/features/dashboard/api/publicDashboardApi'; import { Loader } from 'app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboard'; import { publicDashboardPersisted } from 'app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils'; import { shareDashboardType } from 'app/features/dashboard/components/ShareModal/utils'; -import { DashboardScene } from '../../scene/DashboardScene'; import { SceneShareTabState } from '../types'; import { ConfigPublicDashboard } from './ConfigPublicDashboard'; import { CreatePublicDashboard } from './CreatePublicDashboard'; -export interface SharePublicDashboardTabState extends SceneShareTabState { - dashboardRef: SceneObjectRef; -} - -export class SharePublicDashboardTab extends SceneObjectBase { +export class SharePublicDashboardTab extends SceneObjectBase { public tabId = shareDashboardType.publicDashboard; static Component = SharePublicDashboardTabRenderer; diff --git a/public/app/features/dashboard-scene/sharing/types.ts b/public/app/features/dashboard-scene/sharing/types.ts index dc4ddb676e6..1d4aadf0907 100644 --- a/public/app/features/dashboard-scene/sharing/types.ts +++ b/public/app/features/dashboard-scene/sharing/types.ts @@ -1,10 +1,13 @@ import { SceneObject, SceneObjectRef, SceneObjectState } from '@grafana/scenes'; +import { DashboardScene } from '../scene/DashboardScene'; + export interface ModalSceneObjectLike { onDismiss: () => void; } export interface SceneShareTabState extends SceneObjectState { + dashboardRef: SceneObjectRef; modalRef?: SceneObjectRef; }