import { DataLink, LinkModel } from '@grafana/data'; import { SceneComponentProps, sceneGraph, SceneObjectBase, SceneObjectState, VariableDependencyConfig, VizPanel, } from '@grafana/scenes'; import { Dropdown, Icon, Menu, PanelChrome, ToolbarButton } from '@grafana/ui'; import { getPanelLinks } from './PanelMenuBehavior'; interface VizPanelLinksState extends SceneObjectState { rawLinks?: DataLink[]; links?: LinkModel[]; menu: VizPanelLinksMenu; } export class VizPanelLinks extends SceneObjectBase { protected _variableDependency = new VariableDependencyConfig(this, { onAnyVariableChanged: () => { if (this.state.rawLinks && this.state.rawLinks.length > 0) { this.forceRender(); } }, }); static Component = VizPanelLinksRenderer; } function VizPanelLinksRenderer({ model }: SceneComponentProps) { const { menu, rawLinks } = model.useState(); sceneGraph.getTimeRange(model).useState(); if (!(model.parent instanceof VizPanel)) { throw new Error('VizPanelLinks must be a child of VizPanel'); } if (!rawLinks || rawLinks.length === 0) { return null; } if (rawLinks.length === 1) { const link = getPanelLinks(model.parent)[0]; return ( ); } return ( { return ; }} > ); } export class VizPanelLinksMenu extends SceneObjectBase> { static Component = VizPanelLinksMenuRenderer; } function VizPanelLinksMenuRenderer({ model }: SceneComponentProps) { const { links } = model.useState(); if (!links) { return null; } return ( {links?.map((link, idx) => { return ; })} ); }