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 <oscar.kilhed@grafana.com>
This commit is contained in:
jackyin
2025-01-09 01:14:19 +08:00
committed by GitHub
parent 5a2315dabf
commit 121a9162ff
2 changed files with 32 additions and 2 deletions

View File

@@ -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' },

View File

@@ -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<LibraryPanelBehaviorSt
const libPanelModel = new PanelModel(libPanel.model);
const titleItems: SceneObject[] = [];
if (config.featureToggles.angularDeprecationUI) {
titleItems.push(new AngularDeprecation());
}
titleItems.push(
new VizPanelLinks({
rawLinks: libPanelModel.links,
menu: new VizPanelLinksMenu({ $behaviors: [panelLinksBehavior] }),
})
);
titleItems.push(new PanelNotices());
const vizPanelState: VizPanelState = {
title: libPanelModel.title,
options: libPanelModel.options ?? {},
@@ -56,6 +73,7 @@ export class LibraryPanelBehavior extends SceneObjectBase<LibraryPanelBehaviorSt
pluginVersion: libPanelModel.pluginVersion,
displayMode: libPanelModel.transparent ? 'transparent' : undefined,
description: libPanelModel.description,
titleItems: titleItems,
$data: createPanelDataProvider(libPanelModel),
};