import { CoreApp } from '@grafana/data'; 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 { t } from 'app/core/internationalization'; 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 { useEditPaneInputAutoFocus } from '../scene/layouts-shared/utils'; 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?.().forEach((category) => descriptor.addCategory(category)); } 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(); const notInPanelEdit = panel.getPanelContext().app !== CoreApp.PanelEditor; const newPanelTitle = t('dashboard.new-panel-title', 'New panel'); let ref = useEditPaneInputAutoFocus({ autoFocus: notInPanelEdit && title === newPanelTitle, }); return ( setPanelTitle(panel, e.currentTarget.value)} /> ); } export function PanelDescriptionTextArea({ panel }: { panel: VizPanel }) { const { description } = panel.useState(); return (