import { selectors } from '@grafana/e2e-selectors'; import { config } from '@grafana/runtime'; import { SceneTimeRangeLike, VizPanel } from '@grafana/scenes'; import { DataLinksInlineEditor, Input, TextArea, Switch } from '@grafana/ui'; import { GenAIPanelDescriptionButton } from 'app/features/dashboard/components/GenAI/GenAIPanelDescriptionButton'; import { GenAIPanelTitleButton } from 'app/features/dashboard/components/GenAI/GenAIPanelTitleButton'; import { OptionsPaneCategoryDescriptor } from 'app/features/dashboard/components/PanelEditor/OptionsPaneCategoryDescriptor'; import { OptionsPaneItemDescriptor } from 'app/features/dashboard/components/PanelEditor/OptionsPaneItemDescriptor'; import { getPanelLinksVariableSuggestions } from 'app/features/panel/panellinks/link_srv'; import { VizPanelLinks } from '../scene/PanelLinks'; import { PanelTimeRange } from '../scene/PanelTimeRange'; import { isDashboardLayoutItem } from '../scene/types/DashboardLayoutItem'; import { vizPanelToPanel, transformSceneToSaveModel } from '../serialization/transformSceneToSaveModel'; import { dashboardSceneGraph } from '../utils/dashboardSceneGraph'; import { getDashboardSceneFor } from '../utils/utils'; export function getPanelFrameOptions(panel: VizPanel): OptionsPaneCategoryDescriptor { const descriptor = new OptionsPaneCategoryDescriptor({ title: 'Panel options', id: 'Panel options', isOpenDefault: true, }); const panelLinksObject = dashboardSceneGraph.getPanelLinks(panel); const links = panelLinksObject?.state.rawLinks ?? []; const dashboard = getDashboardSceneFor(panel); const layoutElement = panel.parent!; descriptor .addItem( new OptionsPaneItemDescriptor({ title: 'Title', value: panel.state.title, popularRank: 1, render: function renderTitle() { return ; }, addon: config.featureToggles.dashgpt && ( setPanelTitle(panel, title)} panel={vizPanelToPanel(panel)} dashboard={transformSceneToSaveModel(dashboard)} /> ), }) ) .addItem( new OptionsPaneItemDescriptor({ title: 'Description', value: panel.state.description, render: function renderDescription() { return ; }, addon: config.featureToggles.dashgpt && ( panel.setState({ description })} panel={vizPanelToPanel(panel)} /> ), }) ) .addItem( new OptionsPaneItemDescriptor({ title: 'Transparent background', render: function renderTransparent() { return ; }, }) ) .addCategory( new OptionsPaneCategoryDescriptor({ title: 'Panel links', id: 'Panel links', isOpenDefault: false, itemsCount: links?.length, }).addItem( new OptionsPaneItemDescriptor({ title: 'Panel links', render: () => , }) ) ); if (isDashboardLayoutItem(layoutElement) && layoutElement.getOptions) { descriptor.addCategory(layoutElement.getOptions()); } return descriptor; } interface ScenePanelLinksEditorProps { panelLinks?: VizPanelLinks; } function ScenePanelLinksEditor({ panelLinks }: ScenePanelLinksEditorProps) { const { rawLinks: links } = panelLinks ? panelLinks.useState() : { rawLinks: [] }; return ( panelLinks?.setState({ rawLinks: links })} getSuggestions={getPanelLinksVariableSuggestions} data={[]} /> ); } export function PanelFrameTitleInput({ panel }: { panel: VizPanel }) { const { title } = panel.useState(); return ( setPanelTitle(panel, e.currentTarget.value)} /> ); } export function PanelDescriptionTextArea({ panel }: { panel: VizPanel }) { const { description } = panel.useState(); return (