From 121a9162ffbf08ec21e52f11b7990062eba3bea7 Mon Sep 17 00:00:00 2001 From: jackyin Date: Thu, 9 Jan 2025 01:14:19 +0800 Subject: [PATCH] Library Panel: Fix issue where library panels did not display panel links. (#98655) * add library panel link * opimize * format * add test * fix import orders --------- Co-authored-by: oscarkilhed --- .../scene/LibraryPanelBehavior.test.tsx | 14 ++++++++++++- .../scene/LibraryPanelBehavior.tsx | 20 ++++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/public/app/features/dashboard-scene/scene/LibraryPanelBehavior.test.tsx b/public/app/features/dashboard-scene/scene/LibraryPanelBehavior.test.tsx index a64a6e40664..02a363d5d3a 100644 --- a/public/app/features/dashboard-scene/scene/LibraryPanelBehavior.test.tsx +++ b/public/app/features/dashboard-scene/scene/LibraryPanelBehavior.test.tsx @@ -3,15 +3,17 @@ import { of } from 'rxjs'; import { FieldType, LoadingState, PanelData, getDefaultTimeRange, toDataFrame } from '@grafana/data'; import { getPanelPlugin } from '@grafana/data/test/__mocks__/pluginMocks'; import { setPluginImportUtils, setRunRequest } from '@grafana/runtime'; -import { SceneCanvasText, SceneGridLayout, VizPanel } from '@grafana/scenes'; +import { SceneCanvasText, sceneGraph, SceneGridLayout, VizPanel } from '@grafana/scenes'; import { LibraryPanel } from '@grafana/schema'; import * as libpanels from 'app/features/library-panels/state/api'; import { vizPanelToPanel } from '../serialization/transformSceneToSaveModel'; +import { NEW_LINK } from '../settings/links/utils'; import { activateFullSceneTree } from '../utils/test-utils'; import { DashboardScene } from './DashboardScene'; import { LibraryPanelBehavior } from './LibraryPanelBehavior'; +import { VizPanelLinks } from './PanelLinks'; import { PanelTimeRange } from './PanelTimeRange'; import { DashboardGridItem } from './layout-default/DashboardGridItem'; import { DefaultGridLayoutManager } from './layout-default/DefaultGridLayoutManager'; @@ -82,6 +84,15 @@ describe('LibraryPanelBehavior', () => { expect(spy).toHaveBeenCalled(); }); + it('should include panel links', async () => { + const { scene } = await buildTestSceneWithLibraryPanel(); + + const panel = sceneGraph.findByKey(scene, 'panel-1') as VizPanel; + expect(panel.state.titleItems).toBeDefined(); + const items = panel.state.titleItems as VizPanelLinks[]; + expect(items[0].state.rawLinks![0].title).toBe('link1'); + }); + it('should set panel timeRange if panel has query options set', async () => { const { gridItem } = await buildTestSceneWithLibraryPanel(); @@ -172,6 +183,7 @@ async function buildTestSceneWithLibraryPanel() { model: { title: 'LibraryPanel A title', type: 'table', + links: [{ ...NEW_LINK, title: 'link1' }], options: { showHeader: true }, fieldConfig: { defaults: {}, overrides: [] }, datasource: { uid: 'abcdef' }, diff --git a/public/app/features/dashboard-scene/scene/LibraryPanelBehavior.tsx b/public/app/features/dashboard-scene/scene/LibraryPanelBehavior.tsx index 7ec6e5403aa..423cc2c34ee 100644 --- a/public/app/features/dashboard-scene/scene/LibraryPanelBehavior.tsx +++ b/public/app/features/dashboard-scene/scene/LibraryPanelBehavior.tsx @@ -1,5 +1,6 @@ import { PanelPlugin, PanelProps } from '@grafana/data'; -import { SceneObjectBase, SceneObjectState, sceneUtils, VizPanel, VizPanelState } from '@grafana/scenes'; +import { config } from '@grafana/runtime'; +import { SceneObject, SceneObjectBase, SceneObjectState, sceneUtils, VizPanel, VizPanelState } from '@grafana/scenes'; import { LibraryPanel } from '@grafana/schema'; import { Stack } from '@grafana/ui'; import { Trans } from 'app/core/internationalization'; @@ -8,7 +9,11 @@ import { getLibraryPanel } from 'app/features/library-panels/state/api'; import { createPanelDataProvider } from '../utils/createPanelDataProvider'; +import { VizPanelLinks, VizPanelLinksMenu } from './PanelLinks'; +import { panelLinksBehavior } from './PanelMenuBehavior'; +import { PanelNotices } from './PanelNotices'; import { PanelTimeRange } from './PanelTimeRange'; +import { AngularDeprecation } from './angular/AngularDeprecation'; import { DashboardGridItem } from './layout-default/DashboardGridItem'; export interface LibraryPanelBehaviorState extends SceneObjectState { @@ -48,6 +53,18 @@ export class LibraryPanelBehavior extends SceneObjectBase