diff --git a/packages/grafana-data/src/types/featureToggles.gen.ts b/packages/grafana-data/src/types/featureToggles.gen.ts index 836d7368873..f8d2aa164f8 100644 --- a/packages/grafana-data/src/types/featureToggles.gen.ts +++ b/packages/grafana-data/src/types/featureToggles.gen.ts @@ -1022,4 +1022,9 @@ export interface FeatureToggles { * @default false */ alertingImportAlertmanagerAPI?: boolean; + /** + * Prefer library panel title over viz panel title. + * @default false + */ + preferLibraryPanelTitle?: boolean; } diff --git a/pkg/services/featuremgmt/registry.go b/pkg/services/featuremgmt/registry.go index 2a25cc76433..170bafef157 100644 --- a/pkg/services/featuremgmt/registry.go +++ b/pkg/services/featuremgmt/registry.go @@ -1756,6 +1756,13 @@ var ( HideFromDocs: true, Expression: "false", }, + { + Name: "preferLibraryPanelTitle", + Description: "Prefer library panel title over viz panel title.", + Stage: FeatureStagePrivatePreview, + Owner: grafanaDashboardsSquad, + Expression: "false", + }, } ) diff --git a/pkg/services/featuremgmt/toggles_gen.csv b/pkg/services/featuremgmt/toggles_gen.csv index a517a1c74e8..b1c0b4d990e 100644 --- a/pkg/services/featuremgmt/toggles_gen.csv +++ b/pkg/services/featuremgmt/toggles_gen.csv @@ -229,3 +229,4 @@ restoreDashboards,experimental,@grafana/grafana-frontend-platform,false,false,fa skipTokenRotationIfRecent,privatePreview,@grafana/identity-access-team,false,false,false alertEnrichment,experimental,@grafana/alerting-squad,false,false,false alertingImportAlertmanagerAPI,experimental,@grafana/alerting-squad,false,false,false +preferLibraryPanelTitle,privatePreview,@grafana/dashboards-squad,false,false,false diff --git a/pkg/services/featuremgmt/toggles_gen.go b/pkg/services/featuremgmt/toggles_gen.go index 274dfd44b51..feb2f6dd71a 100644 --- a/pkg/services/featuremgmt/toggles_gen.go +++ b/pkg/services/featuremgmt/toggles_gen.go @@ -926,4 +926,8 @@ const ( // FlagAlertingImportAlertmanagerAPI // Enables the API to import Alertmanager configuration FlagAlertingImportAlertmanagerAPI = "alertingImportAlertmanagerAPI" + + // FlagPreferLibraryPanelTitle + // Prefer library panel title over viz panel title. + FlagPreferLibraryPanelTitle = "preferLibraryPanelTitle" ) diff --git a/pkg/services/featuremgmt/toggles_gen.json b/pkg/services/featuremgmt/toggles_gen.json index 06ef927fa0a..cfc730e72a2 100644 --- a/pkg/services/featuremgmt/toggles_gen.json +++ b/pkg/services/featuremgmt/toggles_gen.json @@ -2611,6 +2611,22 @@ "expression": "false" } }, + { + "metadata": { + "name": "preferLibraryPanelTitle", + "resourceVersion": "1750152018442", + "creationTimestamp": "2025-06-17T08:53:23Z", + "annotations": { + "grafana.app/updatedTimestamp": "2025-06-17 09:20:18.442539 +0000 UTC" + } + }, + "spec": { + "description": "Prefer library panel title over viz panel title.", + "stage": "privatePreview", + "codeowner": "@grafana/dashboards-squad", + "expression": "false" + } + }, { "metadata": { "name": "preinstallAutoUpdate", diff --git a/public/app/features/dashboard-scene/scene/LibraryPanelBehavior.test.tsx b/public/app/features/dashboard-scene/scene/LibraryPanelBehavior.test.tsx index 5d95b292cb4..62a4cc2d77f 100644 --- a/public/app/features/dashboard-scene/scene/LibraryPanelBehavior.test.tsx +++ b/public/app/features/dashboard-scene/scene/LibraryPanelBehavior.test.tsx @@ -2,7 +2,7 @@ import { of } from 'rxjs'; import { FieldType, LoadingState, PanelData, getDefaultTimeRange, toDataFrame } from '@grafana/data'; import { getPanelPlugin } from '@grafana/data/test'; -import { setPluginImportUtils, setRunRequest } from '@grafana/runtime'; +import { config, setPluginImportUtils, setRunRequest } from '@grafana/runtime'; import { SceneCanvasText, sceneGraph, SceneGridLayout, VizPanel } from '@grafana/scenes'; import { LibraryPanel } from '@grafana/schema'; import * as libpanels from 'app/features/library-panels/state/api'; @@ -141,6 +141,21 @@ describe('LibraryPanelBehavior', () => { expect(behavior.state._loadedPanel?.uid).toBe('111'); }); + it('should set the title to the library panel title if the feature toggle is enabled', async () => { + config.featureToggles.preferLibraryPanelTitle = true; + const { gridItem } = await buildTestSceneWithLibraryPanel(); + + expect(gridItem.state.body.state.title).toBe('LibraryPanel A title'); + config.featureToggles.preferLibraryPanelTitle = false; + }); + + it('should set the title to the panel title if the feature toggle is disabled', async () => { + config.featureToggles.preferLibraryPanelTitle = false; + const { gridItem } = await buildTestSceneWithLibraryPanel(); + + expect(gridItem.state.body.state.title).toBe('Panel A'); + }); + it('should not update panel if behavior not part of a vizPanel', async () => { const { gridItem } = await buildTestSceneWithLibraryPanel(); diff --git a/public/app/features/dashboard-scene/scene/LibraryPanelBehavior.tsx b/public/app/features/dashboard-scene/scene/LibraryPanelBehavior.tsx index 4368ee89ca3..c42d1f1b423 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 { Trans } from '@grafana/i18n'; +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'; @@ -59,8 +60,15 @@ export class LibraryPanelBehavior extends SceneObjectBase