{"version":3,"file":"5460.e8318f234615c2f616be.js","mappings":"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","sources":["webpack://grafana/./public/app/core/services/StateManagerBase.ts","webpack://grafana/./public/app/features/dashboard-scene/scene/NavToolbarActions.tsx","webpack://grafana/./public/app/features/dashboard-scene/scene/DashboardSceneRenderer.tsx","webpack://grafana/./public/app/features/dashboard-scene/serialization/transformSceneToSaveModel.ts","webpack://grafana/./public/app/features/dashboard-scene/serialization/SaveDashboardDrawer.tsx","webpack://grafana/./public/app/features/dashboard-scene/inspect/InspectDataTab.tsx","webpack://grafana/./public/app/features/dashboard-scene/inspect/InspectJsonTab.tsx","webpack://grafana/./public/app/features/dashboard-scene/inspect/InspectMetaDataTab.tsx","webpack://grafana/./public/app/features/dashboard-scene/inspect/InspectQueryTab.tsx","webpack://grafana/./public/app/features/dashboard-scene/inspect/InspectStatsTab.tsx","webpack://grafana/./public/app/features/dashboard-scene/inspect/PanelInspectDrawer.tsx","webpack://grafana/./public/app/features/dashboard-scene/scene/DashboardSceneUrlSync.ts","webpack://grafana/./public/app/features/dashboard-scene/scene/DashboardScene.tsx","webpack://grafana/./public/app/features/dashboard-scene/scene/PanelRepeaterGridItem.tsx","webpack://grafana/./public/app/features/dashboard-scene/scene/PanelTimeRange.tsx","webpack://grafana/./public/app/features/dashboard-scene/scene/RowRepeaterBehavior.ts","webpack://grafana/./public/app/features/dashboard-scene/scene/ShareQueryDataProvider.ts","webpack://grafana/./public/app/features/dashboard-scene/utils/createPanelDataProvider.ts","webpack://grafana/./public/app/features/dashboard-scene/scene/LibraryVizPanel.tsx","webpack://grafana/./public/app/features/dashboard-scene/scene/PanelMenuBehavior.tsx","webpack://grafana/./public/app/features/dashboard-scene/serialization/transformSaveModelToScene.ts","webpack://grafana/./public/app/features/dashboard-scene/utils/utils.ts","webpack://grafana/./public/app/features/dashboard/components/Inspector/hooks.ts","webpack://grafana/./.yarn/__virtual__/react-use-virtual-dd7926f458/3/opt/drone/yarncache/react-use-npm-17.4.0-0ef4521544-0889da919b.zip/node_modules/react-use/lib/useAsync.js"],"sourcesContent":["import { useEffect } from 'react';\nimport { Observer, Subject, Subscription } from 'rxjs';\n\nimport { useForceUpdate } from '@grafana/ui';\n\nexport class StateManagerBase {\n private _subject = new Subject();\n private _state: TState;\n\n constructor(state: TState) {\n this._state = state;\n }\n\n useState() {\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useLatestState(this);\n }\n\n get state() {\n return this._state;\n }\n\n setState(update: Partial) {\n this._state = {\n ...this._state,\n ...update,\n };\n this._subject.next(this._state);\n }\n\n /**\n * Subscribe to the scene state subject\n **/\n subscribeToState(observerOrNext?: Partial>): Subscription {\n return this._subject.subscribe(observerOrNext);\n }\n}\n/**\n * This hook is always returning model.state instead of a useState that remembers the last state emitted on the subject\n * The reason for this is so that if the model instance change this function will always return the latest state.\n */\nfunction useLatestState(model: StateManagerBase): TState {\n const forceUpdate = useForceUpdate();\n\n useEffect(() => {\n const s = model.subscribeToState({ next: forceUpdate });\n return () => s.unsubscribe();\n }, [model, forceUpdate]);\n\n return model.state;\n}\n","import React from 'react';\n\nimport { locationService } from '@grafana/runtime';\nimport { Button } from '@grafana/ui';\nimport { AppChromeUpdate } from 'app/core/components/AppChrome/AppChromeUpdate';\nimport { NavToolbarSeparator } from 'app/core/components/AppChrome/NavToolbar/NavToolbarSeparator';\nimport { DashNavButton } from 'app/features/dashboard/components/DashNav/DashNavButton';\n\nimport { DashboardScene } from './DashboardScene';\n\ninterface Props {\n dashboard: DashboardScene;\n}\n\nexport const NavToolbarActions = React.memo(({ dashboard }) => {\n const { actions = [], isEditing, viewPanelKey, isDirty, uid } = dashboard.useState();\n const toolbarActions = (actions ?? []).map((action) => );\n\n if (uid) {\n toolbarActions.push(\n locationService.push(`/d/${uid}`)}\n />\n );\n }\n\n toolbarActions.push();\n\n if (viewPanelKey) {\n toolbarActions.push(\n locationService.partial({ viewPanel: null })}\n tooltip=\"\"\n key=\"back\"\n variant=\"primary\"\n fill=\"text\"\n >\n Back to dashboard\n \n );\n\n return ;\n }\n\n if (!isEditing) {\n // TODO check permissions\n toolbarActions.push(\n \n Edit\n \n );\n } else {\n // TODO check permissions\n toolbarActions.push(\n \n );\n toolbarActions.push(\n \n );\n toolbarActions.push(\n \n );\n }\n\n return ;\n});\n\nNavToolbarActions.displayName = 'NavToolbarActions';\n","import { css } from '@emotion/css';\nimport React from 'react';\nimport { useLocation } from 'react-router-dom';\n\nimport { GrafanaTheme2, PageLayoutType } from '@grafana/data';\nimport { SceneComponentProps, SceneDebugger } from '@grafana/scenes';\nimport { CustomScrollbar, useStyles2 } from '@grafana/ui';\nimport { Page } from 'app/core/components/Page/Page';\n\nimport { DashboardScene } from './DashboardScene';\nimport { NavToolbarActions } from './NavToolbarActions';\n\nexport function DashboardSceneRenderer({ model }: SceneComponentProps) {\n const { controls, viewPanelKey: viewPanelId, drawer } = model.useState();\n const styles = useStyles2(getStyles);\n const location = useLocation();\n const pageNav = model.getPageNav(location);\n const bodyToRender = model.getBodyToRender(viewPanelId);\n\n return (\n \n \n
\n \n {controls && (\n
\n {controls.map((control) => (\n \n ))}\n \n
\n )}\n
\n \n
\n
\n
\n {drawer && }\n
\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n canvasContent: css({\n label: 'canvas-content',\n display: 'flex',\n flexDirection: 'column',\n padding: theme.spacing(0, 2),\n flexBasis: '100%',\n flexGrow: 1,\n }),\n body: css({\n label: 'body',\n flexGrow: 1,\n display: 'flex',\n gap: '8px',\n marginBottom: theme.spacing(2),\n }),\n controls: css({\n display: 'flex',\n flexWrap: 'wrap',\n alignItems: 'center',\n gap: theme.spacing(1),\n position: 'sticky',\n top: 0,\n background: theme.colors.background.canvas,\n zIndex: 1,\n padding: theme.spacing(2, 0),\n }),\n };\n}\n","import { SceneGridItem, SceneGridItemLike, SceneGridLayout, SceneGridRow, VizPanel } from '@grafana/scenes';\nimport { Dashboard, defaultDashboard, FieldConfigSource, Panel, RowPanel } from '@grafana/schema';\nimport { sortedDeepCloneWithoutNulls } from 'app/core/utils/object';\n\nimport { DashboardScene } from '../scene/DashboardScene';\nimport { PanelRepeaterGridItem } from '../scene/PanelRepeaterGridItem';\nimport { PanelTimeRange } from '../scene/PanelTimeRange';\nimport { RowRepeaterBehavior } from '../scene/RowRepeaterBehavior';\nimport { getPanelIdForVizPanel } from '../utils/utils';\n\nexport function transformSceneToSaveModel(scene: DashboardScene): Dashboard {\n const state = scene.state;\n const timeRange = state.$timeRange!.state;\n const body = state.body;\n const panels: Panel[] = [];\n\n if (body instanceof SceneGridLayout) {\n for (const child of body.state.children) {\n if (child instanceof SceneGridItem) {\n panels.push(gridItemToPanel(child));\n }\n\n if (child instanceof SceneGridRow) {\n // Skip repeat clones\n if (child.state.key!.indexOf('-clone-') > 0) {\n continue;\n }\n gridRowToSaveModel(child, panels);\n }\n }\n }\n\n const dashboard: Dashboard = {\n ...defaultDashboard,\n title: state.title,\n uid: state.uid,\n time: {\n from: timeRange.from,\n to: timeRange.to,\n },\n panels,\n };\n\n return sortedDeepCloneWithoutNulls(dashboard);\n}\n\nexport function gridItemToPanel(gridItem: SceneGridItemLike): Panel {\n let vizPanel: VizPanel | undefined;\n let x = 0,\n y = 0,\n w = 0,\n h = 0;\n\n if (gridItem instanceof SceneGridItem) {\n if (!(gridItem.state.body instanceof VizPanel)) {\n throw new Error('SceneGridItem body expected to be VizPanel');\n }\n\n vizPanel = gridItem.state.body;\n x = gridItem.state.x ?? 0;\n y = gridItem.state.y ?? 0;\n w = gridItem.state.width ?? 0;\n h = gridItem.state.height ?? 0;\n }\n\n if (gridItem instanceof PanelRepeaterGridItem) {\n vizPanel = gridItem.state.source;\n\n x = gridItem.state.x ?? 0;\n y = gridItem.state.y ?? 0;\n w = gridItem.state.width ?? 0;\n h = gridItem.state.height ?? 0;\n }\n\n if (!vizPanel) {\n throw new Error('Unsupported grid item type');\n }\n\n const panel: Panel = {\n id: getPanelIdForVizPanel(vizPanel),\n type: vizPanel.state.pluginId,\n title: vizPanel.state.title,\n gridPos: { x, y, w, h },\n options: vizPanel.state.options,\n fieldConfig: (vizPanel.state.fieldConfig as FieldConfigSource) ?? { defaults: {}, overrides: [] },\n transformations: [],\n transparent: false,\n };\n\n const panelTime = vizPanel.state.$timeRange;\n\n if (panelTime instanceof PanelTimeRange) {\n panel.timeFrom = panelTime.state.timeFrom;\n panel.timeShift = panelTime.state.timeShift;\n panel.hideTimeOverride = panelTime.state.hideTimeOverride;\n }\n\n if (vizPanel.state.displayMode === 'transparent') {\n panel.transparent = true;\n }\n\n if (gridItem instanceof PanelRepeaterGridItem) {\n panel.repeat = gridItem.state.variableName;\n panel.maxPerRow = gridItem.state.maxPerRow;\n panel.repeatDirection = gridItem.getRepeatDirection();\n }\n\n return panel;\n}\n\nexport function gridRowToSaveModel(gridRow: SceneGridRow, panelsArray: Array) {\n const rowPanel: RowPanel = {\n type: 'row',\n id: getPanelIdForVizPanel(gridRow),\n title: gridRow.state.title,\n gridPos: {\n x: gridRow.state.x ?? 0,\n y: gridRow.state.y ?? 0,\n w: gridRow.state.width ?? 24,\n h: gridRow.state.height ?? 1,\n },\n collapsed: Boolean(gridRow.state.isCollapsed),\n panels: [],\n };\n\n if (gridRow.state.$behaviors?.length) {\n const behavior = gridRow.state.$behaviors[0];\n\n if (behavior instanceof RowRepeaterBehavior) {\n rowPanel.repeat = behavior.state.variableName;\n }\n }\n\n panelsArray.push(rowPanel);\n\n const panelsInsideRow = gridRow.state.children.map(gridItemToPanel);\n\n if (gridRow.state.isCollapsed) {\n rowPanel.panels = panelsInsideRow;\n } else {\n panelsArray.push(...panelsInsideRow);\n }\n}\n","import React from 'react';\n\nimport { SceneComponentProps, SceneObjectBase, SceneObjectState, SceneObjectRef } from '@grafana/scenes';\nimport { Drawer } from '@grafana/ui';\nimport { SaveDashboardDiff } from 'app/features/dashboard/components/SaveDashboard/SaveDashboardDiff';\nimport { jsonDiff } from 'app/features/dashboard/components/VersionHistory/utils';\n\nimport { DashboardScene } from '../scene/DashboardScene';\n\nimport { transformSceneToSaveModel } from './transformSceneToSaveModel';\n\ninterface SaveDashboardDrawerState extends SceneObjectState {\n dashboardRef: SceneObjectRef;\n}\n\nexport class SaveDashboardDrawer extends SceneObjectBase {\n onClose = () => {\n this.state.dashboardRef.resolve().setState({ drawer: undefined });\n };\n\n static Component = ({ model }: SceneComponentProps) => {\n const dashboard = model.state.dashboardRef.resolve();\n const initialState = dashboard.getInitialState();\n const initialScene = new DashboardScene(initialState!);\n const initialSaveModel = transformSceneToSaveModel(initialScene);\n const changedSaveModel = transformSceneToSaveModel(dashboard);\n\n const diff = jsonDiff(initialSaveModel, changedSaveModel);\n\n // let diffCount = 0;\n // for (const d of Object.values(diff)) {\n // diffCount += d.length;\n // }\n\n return (\n \n \n \n );\n };\n}\n","import React from 'react';\n\nimport { LoadingState } from '@grafana/data';\nimport {\n SceneComponentProps,\n SceneDataProvider,\n SceneDataTransformer,\n sceneGraph,\n SceneObjectBase,\n SceneObjectRef,\n SceneObjectState,\n VizPanel,\n} from '@grafana/scenes';\nimport { t } from 'app/core/internationalization';\nimport { InspectTab } from 'app/features/inspector/types';\nimport { GetDataOptions } from 'app/features/query/state/PanelQueryRunner';\n\nimport { InspectDataTab as InspectDataTabOld } from '../../inspector/InspectDataTab';\n\nexport interface InspectDataTabState extends SceneObjectState {\n panelRef: SceneObjectRef;\n options: GetDataOptions;\n}\n\nexport class InspectDataTab extends SceneObjectBase {\n public constructor(state: Omit) {\n super({\n ...state,\n options: {\n withTransforms: true,\n withFieldConfig: true,\n },\n });\n }\n\n public getTabLabel() {\n return t('dashboard.inspect.data-tab', 'Data');\n }\n\n public getTabValue() {\n return InspectTab.Data;\n }\n\n public onOptionsChange = (options: GetDataOptions) => {\n this.setState({ options });\n };\n\n static Component = ({ model }: SceneComponentProps) => {\n const { options } = model.useState();\n const panel = model.state.panelRef.resolve();\n const dataProvider = sceneGraph.getData(panel);\n const { data } = getDataProviderToSubscribeTo(dataProvider, options.withTransforms).useState();\n const timeRange = sceneGraph.getTimeRange(panel);\n\n if (!data) {\n
No data found
;\n }\n\n return (\n \n );\n };\n}\n\nfunction hasTransformations(dataProvider: SceneDataProvider) {\n if (dataProvider instanceof SceneDataTransformer) {\n return dataProvider.state.transformations.length > 0;\n }\n\n return false;\n}\n\nfunction getDataProviderToSubscribeTo(dataProvider: SceneDataProvider, withTransforms: boolean) {\n if (withTransforms && dataProvider instanceof SceneDataTransformer) {\n return dataProvider.state.$data!;\n }\n\n return dataProvider;\n}\n","import { isEqual } from 'lodash';\nimport React from 'react';\nimport AutoSizer from 'react-virtualized-auto-sizer';\n\nimport { SelectableValue } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport {\n SceneComponentProps,\n SceneDataTransformer,\n sceneGraph,\n SceneGridItem,\n SceneGridItemStateLike,\n SceneObjectBase,\n SceneObjectRef,\n SceneObjectState,\n SceneQueryRunner,\n sceneUtils,\n VizPanel,\n} from '@grafana/scenes';\nimport { Button, CodeEditor, Field, Select, useStyles2 } from '@grafana/ui';\nimport { t } from 'app/core/internationalization';\nimport { getPanelDataFrames } from 'app/features/dashboard/components/HelpWizard/utils';\nimport { PanelModel } from 'app/features/dashboard/state';\nimport { getPanelInspectorStyles2 } from 'app/features/inspector/styles';\nimport { InspectTab } from 'app/features/inspector/types';\nimport { getPrettyJSON } from 'app/features/inspector/utils/utils';\nimport { reportPanelInspectInteraction } from 'app/features/search/page/reporting';\n\nimport { PanelRepeaterGridItem } from '../scene/PanelRepeaterGridItem';\nimport { buildGridItemForPanel } from '../serialization/transformSaveModelToScene';\nimport { gridItemToPanel } from '../serialization/transformSceneToSaveModel';\nimport { getDashboardSceneFor, getPanelIdForVizPanel, getQueryRunnerFor } from '../utils/utils';\n\nexport type ShowContent = 'panel-json' | 'panel-data' | 'data-frames';\n\nexport interface InspectJsonTabState extends SceneObjectState {\n panelRef: SceneObjectRef;\n source: ShowContent;\n jsonText: string;\n onClose: () => void;\n}\n\nexport class InspectJsonTab extends SceneObjectBase {\n public constructor(state: Omit) {\n super({\n ...state,\n source: 'panel-json',\n jsonText: getJsonText('panel-json', state.panelRef.resolve()),\n });\n }\n\n public getTabLabel() {\n return t('dashboard.inspect.json-tab', 'JSON');\n }\n\n public getTabValue() {\n return InspectTab.JSON;\n }\n\n public getOptions(): Array> {\n const panel = this.state.panelRef.resolve();\n const dataProvider = panel.state.$data;\n\n const options: Array> = [\n {\n label: t('dashboard.inspect-json.panel-json-label', 'Panel JSON'),\n description: t(\n 'dashboard.inspect-json.panel-json-description',\n 'The model saved in the dashboard JSON that configures how everything works.'\n ),\n value: 'panel-json',\n },\n ];\n\n if (dataProvider) {\n options.push({\n label: t('dashboard.inspect-json.panel-data-label', 'Panel data'),\n description: t(\n 'dashboard.inspect-json.panel-data-description',\n 'The raw model passed to the panel visualization'\n ),\n value: 'panel-data',\n });\n options.push({\n label: t('dashboard.inspect-json.dataframe-label', 'DataFrame JSON (from Query)'),\n description: t(\n 'dashboard.inspect-json.dataframe-description',\n 'Raw data without transformations and field config applied. '\n ),\n value: 'data-frames',\n });\n }\n\n return options;\n }\n\n public onChangeSource = (value: SelectableValue) => {\n this.setState({ source: value.value!, jsonText: getJsonText(value.value!, this.state.panelRef.resolve()) });\n };\n\n public onApplyChange = () => {\n const panel = this.state.panelRef.resolve();\n const dashboard = getDashboardSceneFor(panel);\n const jsonObj = JSON.parse(this.state.jsonText);\n\n const panelModel = new PanelModel(jsonObj);\n const gridItem = buildGridItemForPanel(panelModel);\n const newState = sceneUtils.cloneSceneObjectState(gridItem.state);\n\n if (!(panel.parent instanceof SceneGridItem) || !(gridItem instanceof SceneGridItem)) {\n console.error('Cannot update state of panel', panel, gridItem);\n return;\n }\n\n this.state.onClose();\n\n if (!dashboard.state.isEditing) {\n dashboard.onEnterEditMode();\n }\n\n panel.parent.setState(newState);\n\n //Report relevant updates\n reportPanelInspectInteraction(InspectTab.JSON, 'apply', {\n panel_type_changed: panel.state.pluginId !== panelModel.type,\n panel_id_changed: getPanelIdForVizPanel(panel) !== panelModel.id,\n panel_grid_pos_changed: hasGridPosChanged(panel.parent.state, newState),\n panel_targets_changed: hasQueriesChanged(getQueryRunnerFor(panel), getQueryRunnerFor(newState.$data)),\n });\n };\n\n public onCodeEditorBlur = (value: string) => {\n this.setState({ jsonText: value });\n };\n\n public isEditable() {\n if (this.state.source !== 'panel-json') {\n return false;\n }\n\n const panel = this.state.panelRef.resolve();\n\n // Only support normal grid items for now and not repeated items\n if (!(panel.parent instanceof SceneGridItem)) {\n return false;\n }\n\n const dashboard = getDashboardSceneFor(panel);\n return dashboard.state.meta.canEdit;\n }\n\n static Component = ({ model }: SceneComponentProps) => {\n const { source: show, jsonText } = model.useState();\n const styles = useStyles2(getPanelInspectorStyles2);\n const options = model.getOptions();\n\n return (\n
\n
\n \n v.value === show) ?? options[0].value}\n onChange={model.onChangeSource}\n />\n \n {model.isEditable() && (\n \n )}\n
\n\n
\n \n {({ height }) => (\n 100}\n value={jsonText}\n readOnly={!model.isEditable()}\n onBlur={model.onCodeEditorBlur}\n />\n )}\n \n
\n
\n );\n };\n}\n\nfunction getJsonText(show: ShowContent, panel: VizPanel): string {\n let objToStringify: object = {};\n\n switch (show) {\n case 'panel-json': {\n reportPanelInspectInteraction(InspectTab.JSON, 'panelData');\n\n if (panel.parent instanceof SceneGridItem || panel.parent instanceof PanelRepeaterGridItem) {\n objToStringify = gridItemToPanel(panel.parent);\n }\n break;\n }\n\n case 'panel-data': {\n reportPanelInspectInteraction(InspectTab.JSON, 'panelJSON');\n\n const dataProvider = sceneGraph.getData(panel);\n if (dataProvider.state.data) {\n objToStringify = panel.applyFieldConfig(dataProvider.state.data);\n }\n break;\n }\n\n case 'data-frames': {\n reportPanelInspectInteraction(InspectTab.JSON, 'dataFrame');\n const dataProvider = sceneGraph.getData(panel);\n\n if (dataProvider.state.data) {\n // Get raw untransformed data\n if (dataProvider instanceof SceneDataTransformer && dataProvider.state.$data?.state.data) {\n objToStringify = getPanelDataFrames(dataProvider.state.$data!.state.data);\n } else {\n objToStringify = getPanelDataFrames(dataProvider.state.data);\n }\n }\n }\n }\n\n return getPrettyJSON(objToStringify);\n}\n\nfunction hasGridPosChanged(a: SceneGridItemStateLike, b: SceneGridItemStateLike) {\n return a.x !== b.x || a.y !== b.y || a.width !== b.width || a.height !== b.height;\n}\n\nfunction hasQueriesChanged(a: SceneQueryRunner | undefined, b: SceneQueryRunner | undefined) {\n if (a === undefined || b === undefined) {\n return false;\n }\n\n return !isEqual(a.state.queries, b.state.queries);\n}\n","import React from 'react';\n\nimport { DataSourceApi } from '@grafana/data';\nimport {\n SceneComponentProps,\n sceneGraph,\n SceneObjectBase,\n SceneObjectState,\n SceneObjectRef,\n VizPanel,\n} from '@grafana/scenes';\nimport { t } from 'app/core/internationalization';\nimport { InspectTab } from 'app/features/inspector/types';\n\nexport interface InspectMetaDataTabState extends SceneObjectState {\n panelRef: SceneObjectRef;\n dataSource: DataSourceApi;\n}\n\nexport class InspectMetaDataTab extends SceneObjectBase {\n public getTabLabel() {\n return t('dashboard.inspect.meta-tab', 'Meta data');\n }\n\n public getTabValue() {\n return InspectTab.Meta;\n }\n\n static Component = ({ model }: SceneComponentProps) => {\n const { panelRef, dataSource } = model.state;\n const data = sceneGraph.getData(panelRef.resolve());\n const Inspector = dataSource.components?.MetadataInspector;\n\n if (!data.state.data || !Inspector) {\n return null;\n }\n\n return ;\n };\n}\n","import React from 'react';\n\nimport {\n SceneComponentProps,\n sceneGraph,\n SceneObjectBase,\n SceneObjectState,\n SceneObjectRef,\n VizPanel,\n} from '@grafana/scenes';\nimport { t } from 'app/core/internationalization';\nimport { QueryInspector } from 'app/features/inspector/QueryInspector';\nimport { InspectTab } from 'app/features/inspector/types';\n\nimport { getQueryRunnerFor } from '../utils/utils';\n\nexport interface InspectQueryTabState extends SceneObjectState {\n panelRef: SceneObjectRef;\n}\n\nexport class InspectQueryTab extends SceneObjectBase {\n public getTabLabel() {\n return t('dashboard.inspect.query-tab', 'Query');\n }\n\n public getTabValue() {\n return InspectTab.Query;\n }\n\n public onRefreshQuery = () => {\n const queryRunner = getQueryRunnerFor(this.state.panelRef.resolve());\n\n if (queryRunner) {\n queryRunner.runQueries();\n }\n };\n\n static Component = ({ model }: SceneComponentProps) => {\n const data = sceneGraph.getData(model.state.panelRef.resolve()).useState();\n\n if (!data.data) {\n return null;\n }\n\n return ;\n };\n}\n","import React from 'react';\n\nimport {\n SceneComponentProps,\n sceneGraph,\n SceneObjectBase,\n SceneObjectState,\n SceneObjectRef,\n VizPanel,\n} from '@grafana/scenes';\nimport { t } from 'app/core/internationalization';\nimport { InspectTab } from 'app/features/inspector/types';\n\nimport { InspectStatsTab as OldInspectStatsTab } from '../../inspector/InspectStatsTab';\n\nexport interface InspectDataTabState extends SceneObjectState {\n panelRef: SceneObjectRef;\n}\n\nexport class InspectStatsTab extends SceneObjectBase {\n public getTabLabel() {\n return t('dashboard.inspect.stats-tab', 'Stats');\n }\n\n public getTabValue() {\n return InspectTab.Stats;\n }\n\n static Component = ({ model }: SceneComponentProps) => {\n const data = sceneGraph.getData(model.state.panelRef.resolve()).useState();\n const timeRange = sceneGraph.getTimeRange(model.state.panelRef.resolve());\n\n if (!data.data) {\n return null;\n }\n\n return ;\n };\n}\n","import React from 'react';\nimport { useLocation } from 'react-router-dom';\n\nimport { locationUtil } from '@grafana/data';\nimport { locationService } from '@grafana/runtime';\nimport {\n SceneComponentProps,\n SceneObjectBase,\n SceneObjectState,\n sceneGraph,\n VizPanel,\n SceneObjectRef,\n} from '@grafana/scenes';\nimport { Alert, Drawer, Tab, TabsBar } from '@grafana/ui';\nimport { getDataSourceWithInspector } from 'app/features/dashboard/components/Inspector/hooks';\nimport { supportsDataQuery } from 'app/features/dashboard/components/PanelEditor/utils';\n\nimport { InspectDataTab } from './InspectDataTab';\nimport { InspectJsonTab } from './InspectJsonTab';\nimport { InspectMetaDataTab } from './InspectMetaDataTab';\nimport { InspectQueryTab } from './InspectQueryTab';\nimport { InspectStatsTab } from './InspectStatsTab';\nimport { SceneInspectTab } from './types';\n\ninterface PanelInspectDrawerState extends SceneObjectState {\n tabs?: SceneInspectTab[];\n panelRef: SceneObjectRef;\n pluginNotLoaded?: boolean;\n canEdit?: boolean;\n}\n\nexport class PanelInspectDrawer extends SceneObjectBase {\n static Component = PanelInspectRenderer;\n\n constructor(state: PanelInspectDrawerState) {\n super(state);\n this.addActivationHandler(() => this._activationHandler());\n }\n\n private _activationHandler() {\n this.buildTabs(0);\n }\n\n /**\n * We currently have no async await to get the panel plugin from the VizPanel.\n * That is why there is a retry argument here and a setTimeout, to try again a bit later.\n */\n async buildTabs(retry: number) {\n const panelRef = this.state.panelRef;\n const panel = panelRef.resolve();\n const plugin = panel.getPlugin();\n const tabs: SceneInspectTab[] = [];\n\n if (!plugin) {\n if (retry < 2000) {\n setTimeout(() => this.buildTabs(retry + 100), 100);\n } else {\n this.setState({ pluginNotLoaded: true });\n }\n }\n\n if (supportsDataQuery(plugin)) {\n const data = sceneGraph.getData(panel);\n\n tabs.push(new InspectDataTab({ panelRef }));\n tabs.push(new InspectStatsTab({ panelRef }));\n tabs.push(new InspectQueryTab({ panelRef }));\n\n const dsWithInspector = await getDataSourceWithInspector(data.state.data);\n if (dsWithInspector) {\n tabs.push(new InspectMetaDataTab({ panelRef, dataSource: dsWithInspector }));\n }\n }\n\n tabs.push(new InspectJsonTab({ panelRef, onClose: this.onClose }));\n\n this.setState({ tabs });\n }\n\n getDrawerTitle() {\n const panel = this.state.panelRef.resolve();\n return sceneGraph.interpolate(panel, `Inspect: ${panel.state.title}`);\n }\n\n onClose = () => {\n locationService.partial({ inspect: null, inspectTab: null });\n };\n}\n\nfunction PanelInspectRenderer({ model }: SceneComponentProps) {\n const { tabs, pluginNotLoaded } = model.useState();\n const location = useLocation();\n const queryParams = new URLSearchParams(location.search);\n\n if (!tabs) {\n return null;\n }\n\n const urlTab = queryParams.get('inspectTab');\n const currentTab = tabs.find((tab) => tab.getTabValue() === urlTab) ?? tabs[0];\n\n return (\n \n {tabs.map((tab) => {\n return (\n \n );\n })}\n \n }\n >\n {pluginNotLoaded && (\n \n Make sure the panel you want to inspect is visible and has been displayed before opening inspect.\n \n )}\n {currentTab && currentTab.Component && }\n \n );\n}\n","import { AppEvents } from '@grafana/data';\nimport { locationService } from '@grafana/runtime';\nimport { SceneObjectRef, SceneObjectUrlSyncHandler, SceneObjectUrlValues } from '@grafana/scenes';\nimport appEvents from 'app/core/app_events';\n\nimport { PanelInspectDrawer } from '../inspect/PanelInspectDrawer';\nimport { findVizPanelByKey } from '../utils/utils';\n\nimport { DashboardScene, DashboardSceneState } from './DashboardScene';\n\nexport class DashboardSceneUrlSync implements SceneObjectUrlSyncHandler {\n constructor(private _scene: DashboardScene) {}\n\n getKeys(): string[] {\n return ['inspect', 'viewPanel'];\n }\n\n getUrlState(): SceneObjectUrlValues {\n const state = this._scene.state;\n return { inspect: state.inspectPanelKey, viewPanel: state.viewPanelKey };\n }\n\n updateFromUrl(values: SceneObjectUrlValues): void {\n const { inspectPanelKey: inspectPanelId, viewPanelKey: viewPanelId } = this._scene.state;\n const update: Partial = {};\n\n // Handle inspect object state\n if (typeof values.inspect === 'string') {\n const panel = findVizPanelByKey(this._scene, values.inspect);\n if (!panel) {\n appEvents.emit(AppEvents.alertError, ['Panel not found']);\n locationService.partial({ inspect: null });\n return;\n }\n\n update.inspectPanelKey = values.inspect;\n update.drawer = new PanelInspectDrawer({ panelRef: new SceneObjectRef(panel) });\n } else if (inspectPanelId) {\n update.inspectPanelKey = undefined;\n update.drawer = undefined;\n }\n\n // Handle view panel state\n if (typeof values.viewPanel === 'string') {\n const panel = findVizPanelByKey(this._scene, values.viewPanel);\n if (!panel) {\n appEvents.emit(AppEvents.alertError, ['Panel not found']);\n locationService.partial({ viewPanel: null });\n return;\n }\n\n update.viewPanelKey = values.viewPanel;\n } else if (viewPanelId) {\n update.viewPanelKey = undefined;\n }\n\n if (Object.keys(update).length > 0) {\n this._scene.setState(update);\n }\n }\n}\n","import * as H from 'history';\nimport { Unsubscribable } from 'rxjs';\n\nimport { NavModelItem, UrlQueryMap } from '@grafana/data';\nimport { locationService } from '@grafana/runtime';\nimport {\n getUrlSyncManager,\n SceneFlexLayout,\n SceneGridItem,\n SceneGridLayout,\n SceneObject,\n SceneObjectBase,\n SceneObjectRef,\n SceneObjectState,\n SceneObjectStateChangedEvent,\n sceneUtils,\n} from '@grafana/scenes';\nimport { DashboardMeta } from 'app/types';\n\nimport { DashboardSceneRenderer } from '../scene/DashboardSceneRenderer';\nimport { SaveDashboardDrawer } from '../serialization/SaveDashboardDrawer';\nimport { findVizPanelByKey, forceRenderChildren, getDashboardUrl } from '../utils/utils';\n\nimport { DashboardSceneUrlSync } from './DashboardSceneUrlSync';\n\nexport interface DashboardSceneState extends SceneObjectState {\n title: string;\n uid?: string;\n body: SceneObject;\n actions?: SceneObject[];\n controls?: SceneObject[];\n isEditing?: boolean;\n isDirty?: boolean;\n /** meta flags */\n meta: DashboardMeta;\n /** Panel to inspect */\n inspectPanelKey?: string;\n /** Panel to view in full screen */\n viewPanelKey?: string;\n /** Scene object that handles the current drawer */\n drawer?: SceneObject;\n}\n\nexport class DashboardScene extends SceneObjectBase {\n static Component = DashboardSceneRenderer;\n\n /**\n * Handles url sync\n */\n protected _urlSync = new DashboardSceneUrlSync(this);\n /**\n * State before editing started\n */\n private _initialState?: DashboardSceneState;\n /**\n * Url state before editing started\n */\n private _initiallUrlState?: UrlQueryMap;\n /**\n * change tracking subscription\n */\n private _changeTrackerSub?: Unsubscribable;\n\n public constructor(state: Partial) {\n super({\n title: 'Dashboard',\n meta: {},\n body: state.body ?? new SceneFlexLayout({ children: [] }),\n ...state,\n });\n\n this.addActivationHandler(() => this._activationHandler());\n }\n\n private _activationHandler() {\n if (this.state.isEditing) {\n this.startTrackingChanges();\n }\n\n // Deactivation logic\n return () => {\n this.stopTrackingChanges();\n this.stopUrlSync();\n };\n }\n\n public startUrlSync() {\n getUrlSyncManager().initSync(this);\n }\n\n public stopUrlSync() {\n getUrlSyncManager().cleanUp(this);\n }\n\n public onEnterEditMode = () => {\n // Save this state\n this._initialState = sceneUtils.cloneSceneObjectState(this.state);\n this._initiallUrlState = locationService.getSearchObject();\n\n // Switch to edit mode\n this.setState({ isEditing: true });\n\n // Propagate change edit mode change to children\n if (this.state.body instanceof SceneGridLayout) {\n this.state.body.setState({ isDraggable: true, isResizable: true });\n forceRenderChildren(this.state.body, true);\n }\n\n this.startTrackingChanges();\n };\n\n public onDiscard = () => {\n // No need to listen to changes anymore\n this.stopTrackingChanges();\n // Stop url sync before updating url\n this.stopUrlSync();\n // Now we can update url\n locationService.partial(this._initiallUrlState!, true);\n // Update state and disable editing\n this.setState({ ...this._initialState, isEditing: false });\n // and start url sync again\n this.startUrlSync();\n\n // Disable grid dragging\n if (this.state.body instanceof SceneGridLayout) {\n this.state.body.setState({ isDraggable: false, isResizable: false });\n forceRenderChildren(this.state.body, true);\n }\n };\n\n public onSave = () => {\n this.setState({ drawer: new SaveDashboardDrawer({ dashboardRef: new SceneObjectRef(this) }) });\n };\n\n public getPageNav(location: H.Location) {\n let pageNav: NavModelItem = {\n text: this.state.title,\n url: getDashboardUrl({\n uid: this.state.uid,\n currentQueryParams: location.search,\n updateQuery: { viewPanel: null, inspect: null },\n }),\n };\n\n if (this.state.viewPanelKey) {\n pageNav = {\n text: 'View panel',\n parentItem: pageNav,\n };\n }\n\n return pageNav;\n }\n\n /**\n * Returns the body (layout) or the full view panel\n */\n public getBodyToRender(viewPanelKey?: string): SceneObject {\n const viewPanel = findVizPanelByKey(this, viewPanelKey);\n return viewPanel ?? this.state.body;\n }\n\n private startTrackingChanges() {\n this._changeTrackerSub = this.subscribeToEvent(\n SceneObjectStateChangedEvent,\n (event: SceneObjectStateChangedEvent) => {\n if (event.payload.changedObject instanceof SceneGridItem) {\n this.setIsDirty();\n }\n }\n );\n }\n\n private setIsDirty() {\n if (!this.state.isDirty) {\n this.setState({ isDirty: true });\n }\n }\n\n private stopTrackingChanges() {\n this._changeTrackerSub?.unsubscribe();\n }\n\n public getInitialState(): DashboardSceneState | undefined {\n return this._initialState;\n }\n}\n","import { css } from '@emotion/css';\nimport React, { useMemo } from 'react';\n\nimport { config } from '@grafana/runtime';\nimport {\n VizPanel,\n SceneObjectBase,\n VariableDependencyConfig,\n SceneVariable,\n SceneGridLayout,\n SceneVariableSet,\n SceneComponentProps,\n SceneGridItemStateLike,\n SceneGridItemLike,\n sceneGraph,\n MultiValueVariable,\n LocalValueVariable,\n} from '@grafana/scenes';\nimport { GRID_CELL_HEIGHT, GRID_CELL_VMARGIN } from 'app/core/constants';\n\nimport { getMultiVariableValues } from '../utils/utils';\n\ninterface PanelRepeaterGridItemState extends SceneGridItemStateLike {\n source: VizPanel;\n repeatedPanels?: VizPanel[];\n variableName: string;\n itemHeight?: number;\n repeatDirection?: RepeatDirection | string;\n maxPerRow?: number;\n}\n\nexport type RepeatDirection = 'v' | 'h';\n\nexport class PanelRepeaterGridItem extends SceneObjectBase implements SceneGridItemLike {\n protected _variableDependency = new VariableDependencyConfig(this, {\n variableNames: [this.state.variableName],\n onVariableUpdatesCompleted: this._onVariableChanged.bind(this),\n });\n\n private _isWaitingForVariables = false;\n\n public constructor(state: PanelRepeaterGridItemState) {\n super(state);\n\n this.addActivationHandler(() => this._activationHandler());\n }\n\n private _activationHandler() {\n this._subs.add(this.subscribeToState((newState, prevState) => this._handleGridResize(newState, prevState)));\n\n // If we our variable is ready we can process repeats on activation\n if (sceneGraph.hasVariableDependencyInLoadingState(this)) {\n this._isWaitingForVariables = true;\n } else {\n this._performRepeat();\n }\n }\n\n private _onVariableChanged(changedVariables: Set, dependencyChanged: boolean): void {\n if (dependencyChanged) {\n this._performRepeat();\n return;\n }\n\n // If we are waiting for variables and the variable is no longer loading then we are ready to repeat as well\n if (this._isWaitingForVariables && !sceneGraph.hasVariableDependencyInLoadingState(this)) {\n this._isWaitingForVariables = false;\n this._performRepeat();\n }\n }\n\n /**\n * Uses the current repeat item count to calculate the user intended desired itemHeight\n */\n private _handleGridResize(newState: PanelRepeaterGridItemState, prevState: PanelRepeaterGridItemState) {\n const itemCount = this.state.repeatedPanels?.length ?? 1;\n const stateChange: Partial = {};\n\n // Height changed\n if (newState.height === prevState.height) {\n return;\n }\n\n if (this.getRepeatDirection() === 'v') {\n const itemHeight = Math.ceil(newState.height! / itemCount);\n stateChange.itemHeight = itemHeight;\n } else {\n const rowCount = Math.ceil(itemCount / this.getMaxPerRow());\n stateChange.itemHeight = Math.ceil(newState.height! / rowCount);\n }\n\n if (stateChange.itemHeight !== this.state.itemHeight) {\n this.setState(stateChange);\n }\n }\n\n private _performRepeat() {\n const variable = sceneGraph.lookupVariable(this.state.variableName, this);\n if (!variable) {\n console.error('SceneGridItemRepeater: Variable not found');\n return;\n }\n\n if (!(variable instanceof MultiValueVariable)) {\n console.error('PanelRepeaterGridItem: Variable is not a MultiValueVariable');\n return;\n }\n\n const panelToRepeat = this.state.source;\n const { values, texts } = getMultiVariableValues(variable);\n const repeatedPanels: VizPanel[] = [];\n\n // Loop through variable values and create repeates\n for (let index = 0; index < values.length; index++) {\n const clone = panelToRepeat.clone({\n $variables: new SceneVariableSet({\n variables: [\n new LocalValueVariable({ name: variable.state.name, value: values[index], text: String(texts[index]) }),\n ],\n }),\n key: `${panelToRepeat.state.key}-clone-${index}`,\n });\n\n repeatedPanels.push(clone);\n }\n\n const direction = this.getRepeatDirection();\n const stateChange: Partial = { repeatedPanels: repeatedPanels };\n const itemHeight = this.state.itemHeight ?? 10;\n const maxPerRow = this.getMaxPerRow();\n\n if (direction === 'h') {\n const rowCount = Math.ceil(repeatedPanels.length / maxPerRow);\n stateChange.height = rowCount * itemHeight;\n } else {\n stateChange.height = repeatedPanels.length * itemHeight;\n }\n\n this.setState(stateChange);\n\n // In case we updated our height the grid layout needs to be update\n if (this.parent instanceof SceneGridLayout) {\n this.parent!.forceRender();\n }\n }\n\n private getMaxPerRow(): number {\n return this.state.maxPerRow ?? 4;\n }\n\n public getRepeatDirection(): RepeatDirection {\n return this.state.repeatDirection === 'v' ? 'v' : 'h';\n }\n\n public getClassName() {\n return 'panel-repeater-grid-item';\n }\n\n public static Component = ({ model }: SceneComponentProps) => {\n const { repeatedPanels, itemHeight } = model.useState();\n const itemCount = repeatedPanels?.length ?? 0;\n const layoutStyle = useLayoutStyle(model.getRepeatDirection(), itemCount, model.getMaxPerRow(), itemHeight ?? 10);\n\n if (!repeatedPanels) {\n return null;\n }\n\n return (\n
\n {repeatedPanels.map((panel) => (\n
\n \n
\n ))}\n
\n );\n };\n}\n\nfunction useLayoutStyle(direction: RepeatDirection, itemCount: number, maxPerRow: number, itemHeight: number) {\n return useMemo(() => {\n const theme = config.theme2;\n\n // In mobile responsive layout we have to calculate the absolute height\n const mobileHeight = itemHeight * GRID_CELL_HEIGHT * itemCount + (itemCount - 1) * GRID_CELL_VMARGIN;\n\n if (direction === 'h') {\n const rowCount = Math.ceil(itemCount / maxPerRow);\n const columnCount = Math.ceil(itemCount / rowCount);\n\n return css({\n display: 'grid',\n height: '100%',\n width: '100%',\n gridTemplateColumns: `repeat(${columnCount}, 1fr)`,\n gridTemplateRows: `repeat(${rowCount}, 1fr)`,\n gridColumnGap: theme.spacing(1),\n gridRowGap: theme.spacing(1),\n\n [theme.breakpoints.down('md')]: {\n display: 'flex',\n flexDirection: 'column',\n height: mobileHeight,\n },\n });\n }\n\n // Vertical is a bit simpler\n return css({\n display: 'flex',\n height: '100%',\n width: '100%',\n flexDirection: 'column',\n gap: theme.spacing(1),\n [theme.breakpoints.down('md')]: {\n height: mobileHeight,\n },\n });\n }, [direction, itemCount, maxPerRow, itemHeight]);\n}\n\nconst itemStyle = css({\n display: 'flex',\n flexGrow: 1,\n position: 'relative',\n});\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { dateMath, getDefaultTimeRange, GrafanaTheme2, rangeUtil, TimeRange } from '@grafana/data';\nimport {\n SceneComponentProps,\n sceneGraph,\n SceneTimeRangeLike,\n SceneTimeRangeState,\n SceneTimeRangeTransformerBase,\n} from '@grafana/scenes';\nimport { Icon, PanelChrome, TimePickerTooltip, Tooltip, useStyles2 } from '@grafana/ui';\nimport { TimeOverrideResult } from 'app/features/dashboard/utils/panel';\n\ninterface PanelTimeRangeState extends SceneTimeRangeState {\n timeFrom?: string;\n timeShift?: string;\n hideTimeOverride?: boolean;\n timeInfo?: string;\n}\n\nexport class PanelTimeRange extends SceneTimeRangeTransformerBase implements SceneTimeRangeLike {\n public static Component = PanelTimeRangeRenderer;\n\n public constructor(state: Partial = {}) {\n super({\n ...state,\n // This time range is not valid until activation\n from: 'now-6h',\n to: 'now',\n value: getDefaultTimeRange(),\n });\n }\n\n protected ancestorTimeRangeChanged(timeRange: SceneTimeRangeState): void {\n const overrideResult = this.getTimeOverride(timeRange.value);\n this.setState({ value: overrideResult.timeRange, timeInfo: overrideResult.timeInfo });\n }\n\n private getTimeOverride(parentTimeRange: TimeRange): TimeOverrideResult {\n const { timeFrom, timeShift } = this.state;\n const newTimeData = { timeInfo: '', timeRange: parentTimeRange };\n\n if (timeFrom) {\n const timeFromInterpolated = sceneGraph.interpolate(this, this.state.timeFrom);\n const timeFromInfo = rangeUtil.describeTextRange(timeFromInterpolated);\n\n if (timeFromInfo.invalid) {\n newTimeData.timeInfo = 'invalid time override';\n return newTimeData;\n }\n\n // Only evaluate if the timeFrom if parent time is relative\n if (rangeUtil.isRelativeTimeRange(parentTimeRange.raw)) {\n newTimeData.timeInfo = timeFromInfo.display;\n newTimeData.timeRange = {\n from: dateMath.parse(timeFromInfo.from)!,\n to: dateMath.parse(timeFromInfo.to)!,\n raw: { from: timeFromInfo.from, to: timeFromInfo.to },\n };\n }\n }\n\n if (timeShift) {\n const timeShiftInterpolated = sceneGraph.interpolate(this, this.state.timeShift);\n const timeShiftInfo = rangeUtil.describeTextRange(timeShiftInterpolated);\n\n if (timeShiftInfo.invalid) {\n newTimeData.timeInfo = 'invalid timeshift';\n return newTimeData;\n }\n\n const timeShift = '-' + timeShiftInterpolated;\n newTimeData.timeInfo += ' timeshift ' + timeShift;\n const from = dateMath.parseDateMath(timeShift, newTimeData.timeRange.from, false)!;\n const to = dateMath.parseDateMath(timeShift, newTimeData.timeRange.to, true)!;\n\n newTimeData.timeRange = { from, to, raw: { from, to } };\n }\n\n return newTimeData;\n }\n}\n\nfunction PanelTimeRangeRenderer({ model }: SceneComponentProps) {\n const { timeInfo, hideTimeOverride } = model.useState();\n const styles = useStyles2(getStyles);\n\n if (!timeInfo || hideTimeOverride) {\n return null;\n }\n\n return (\n }>\n \n {timeInfo}\n \n \n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n timeshift: css({\n color: theme.colors.text.link,\n gap: theme.spacing(0.5),\n }),\n };\n};\n","import {\n LocalValueVariable,\n MultiValueVariable,\n sceneGraph,\n SceneGridItemLike,\n SceneGridLayout,\n SceneGridRow,\n SceneObjectBase,\n SceneObjectState,\n SceneVariable,\n SceneVariableSet,\n VariableDependencyConfig,\n VariableValueSingle,\n} from '@grafana/scenes';\n\nimport { getMultiVariableValues } from '../utils/utils';\n\ninterface RowRepeaterBehaviorState extends SceneObjectState {\n variableName: string;\n sources: SceneGridItemLike[];\n}\n\n/**\n * This behavior will run an effect function when specified variables change\n */\n\nexport class RowRepeaterBehavior extends SceneObjectBase {\n protected _variableDependency = new VariableDependencyConfig(this, {\n variableNames: [this.state.variableName],\n onVariableUpdatesCompleted: this._onVariableChanged.bind(this),\n });\n\n private _isWaitingForVariables = false;\n\n public constructor(state: RowRepeaterBehaviorState) {\n super(state);\n\n this.addActivationHandler(() => this._activationHandler());\n }\n\n private _activationHandler() {\n // If we our variable is ready we can process repeats on activation\n if (sceneGraph.hasVariableDependencyInLoadingState(this)) {\n this._isWaitingForVariables = true;\n } else {\n this._performRepeat();\n }\n }\n\n private _onVariableChanged(changedVariables: Set, dependencyChanged: boolean): void {\n if (dependencyChanged) {\n this._performRepeat();\n return;\n }\n\n // If we are waiting for variables and the variable is no longer loading then we are ready to repeat as well\n if (this._isWaitingForVariables && !sceneGraph.hasVariableDependencyInLoadingState(this)) {\n this._isWaitingForVariables = false;\n this._performRepeat();\n }\n }\n\n private _performRepeat() {\n const variable = sceneGraph.lookupVariable(this.state.variableName, this.parent?.parent!);\n\n if (!variable) {\n console.error('RepeatedRowBehavior: Variable not found');\n return;\n }\n\n if (!(variable instanceof MultiValueVariable)) {\n console.error('RepeatedRowBehavior: Variable is not a MultiValueVariable');\n return;\n }\n\n if (!(this.parent instanceof SceneGridRow)) {\n console.error('RepeatedRowBehavior: Parent is not a SceneGridRow');\n return;\n }\n\n const layout = sceneGraph.getLayout(this);\n\n if (!(layout instanceof SceneGridLayout)) {\n console.error('RepeatedRowBehavior: Layout is not a SceneGridLayout');\n return;\n }\n\n const rowToRepeat = this.parent as SceneGridRow;\n const { values, texts } = getMultiVariableValues(variable);\n const rows: SceneGridRow[] = [];\n const rowContentHeight = getRowContentHeight(this.state.sources);\n let maxYOfRows = 0;\n\n // Loop through variable values and create repeates\n for (let index = 0; index < values.length; index++) {\n const children: SceneGridItemLike[] = [];\n\n // Loop through panels inside row\n for (const source of this.state.sources) {\n const sourceItemY = source.state.y ?? 0;\n const itemY = sourceItemY + (rowContentHeight + 1) * index;\n\n const itemClone = source.clone({\n key: `${source.state.key}-clone-${index}`,\n y: itemY,\n });\n\n //Make sure all the child scene objects have unique keys\n ensureUniqueKeys(itemClone, index);\n\n children.push(itemClone);\n\n if (maxYOfRows < itemY + itemClone.state.height!) {\n maxYOfRows = itemY + itemClone.state.height!;\n }\n }\n\n const rowClone = this.getRowClone(rowToRepeat, index, values[index], texts[index], rowContentHeight, children);\n rows.push(rowClone);\n }\n\n updateLayout(layout, rows, maxYOfRows, rowToRepeat);\n }\n\n getRowClone(\n rowToRepeat: SceneGridRow,\n index: number,\n value: VariableValueSingle,\n text: VariableValueSingle,\n rowContentHeight: number,\n children: SceneGridItemLike[]\n ): SceneGridRow {\n if (index === 0) {\n rowToRepeat.setState({\n // not activated\n $variables: new SceneVariableSet({\n variables: [new LocalValueVariable({ name: this.state.variableName, value, text: String(text) })],\n }),\n children,\n });\n return rowToRepeat;\n }\n\n const sourceRowY = rowToRepeat.state.y ?? 0;\n\n return rowToRepeat.clone({\n key: `${rowToRepeat.state.key}-clone-${index}`,\n $variables: new SceneVariableSet({\n variables: [new LocalValueVariable({ name: this.state.variableName, value, text: String(text) })],\n }),\n $behaviors: [],\n children,\n y: sourceRowY + rowContentHeight * index + index,\n });\n }\n}\n\nfunction getRowContentHeight(panels: SceneGridItemLike[]): number {\n let maxY = 0;\n let minY = Number.MAX_VALUE;\n\n for (const panel of panels) {\n if (panel.state.y! + panel.state.height! > maxY) {\n maxY = panel.state.y! + panel.state.height!;\n }\n if (panel.state.y! < minY) {\n minY = panel.state.y!;\n }\n }\n\n return maxY - minY;\n}\n\nfunction updateLayout(layout: SceneGridLayout, rows: SceneGridRow[], maxYOfRows: number, rowToRepeat: SceneGridRow) {\n const allChildren = getLayoutChildrenFilterOutRepeatClones(layout, rowToRepeat);\n const index = allChildren.indexOf(rowToRepeat);\n\n if (index === -1) {\n throw new Error('RowRepeaterBehavior: Parent row not found in layout children');\n }\n\n const newChildren = [...allChildren.slice(0, index), ...rows, ...allChildren.slice(index + 1)];\n\n // Is there grid items after rows?\n if (allChildren.length > index + 1) {\n const childrenAfter = allChildren.slice(index + 1);\n const firstChildAfterY = childrenAfter[0].state.y!;\n const diff = maxYOfRows - firstChildAfterY;\n\n for (const child of childrenAfter) {\n if (child.state.y! < maxYOfRows) {\n child.setState({ y: child.state.y! + diff });\n }\n }\n }\n\n layout.setState({ children: newChildren });\n}\n\nfunction getLayoutChildrenFilterOutRepeatClones(layout: SceneGridLayout, rowToRepeat: SceneGridRow) {\n return layout.state.children.filter((child) => {\n if (child.state.key?.startsWith(`${rowToRepeat.state.key}-clone-`)) {\n return false;\n }\n\n return true;\n });\n}\n\nfunction ensureUniqueKeys(item: SceneGridItemLike, rowIndex: number) {\n item.forEachChild((child) => {\n child.setState({ key: `${child.state.key}-row-${rowIndex}` });\n ensureUniqueKeys(child, rowIndex);\n });\n}\n","import { Unsubscribable } from 'rxjs';\n\nimport {\n SceneDataProvider,\n SceneDataState,\n SceneDataTransformer,\n SceneDeactivationHandler,\n SceneObject,\n SceneObjectBase,\n} from '@grafana/scenes';\nimport { DashboardQuery } from 'app/plugins/datasource/dashboard/types';\n\nimport { getVizPanelKeyForPanelId } from '../utils/utils';\n\nexport interface ShareQueryDataProviderState extends SceneDataState {\n query: DashboardQuery;\n}\n\nexport class ShareQueryDataProvider extends SceneObjectBase implements SceneDataProvider {\n private _querySub: Unsubscribable | undefined;\n private _sourceDataDeactivationHandler?: SceneDeactivationHandler;\n\n constructor(state: ShareQueryDataProviderState) {\n super(state);\n\n this.addActivationHandler(() => {\n // TODO handle changes to query model (changed panelId / withTransforms)\n //this.subscribeToState(this._onStateChanged);\n\n this._subscribeToSource();\n\n return () => {\n if (this._querySub) {\n this._querySub.unsubscribe();\n }\n if (this._sourceDataDeactivationHandler) {\n this._sourceDataDeactivationHandler();\n }\n };\n });\n }\n\n private _subscribeToSource() {\n const { query } = this.state;\n\n if (this._querySub) {\n this._querySub.unsubscribe();\n }\n\n if (!query.panelId) {\n return;\n }\n\n const keyToFind = getVizPanelKeyForPanelId(query.panelId);\n const source = findObjectInScene(this.getRoot(), (scene: SceneObject) => scene.state.key === keyToFind);\n\n if (!source) {\n console.log('Shared dashboard query refers to a panel that does not exist in the scene');\n return;\n }\n\n let sourceData = source.state.$data;\n if (!sourceData) {\n console.log('No source data found for shared dashboard query');\n return;\n }\n\n // This will activate if sourceData is part of hidden panel\n // Also make sure the sourceData is not deactivated if hidden later\n this._sourceDataDeactivationHandler = sourceData.activate();\n\n if (sourceData instanceof SceneDataTransformer) {\n if (!query.withTransforms) {\n if (!sourceData.state.$data) {\n throw new Error('No source inner query runner found in data transformer');\n }\n sourceData = sourceData.state.$data;\n }\n }\n\n this._querySub = sourceData.subscribeToState((state) => this.setState({ data: state.data }));\n\n // Copy the initial state\n this.setState({ data: sourceData.state.data });\n }\n}\n\nexport function findObjectInScene(scene: SceneObject, check: (scene: SceneObject) => boolean): SceneObject | null {\n if (check(scene)) {\n return scene;\n }\n\n let found: SceneObject | null = null;\n\n scene.forEachChild((child) => {\n let maybe = findObjectInScene(child, check);\n if (maybe) {\n found = maybe;\n }\n });\n\n return found;\n}\n","import { config } from '@grafana/runtime';\nimport { SceneDataProvider, SceneDataTransformer, SceneQueryRunner } from '@grafana/scenes';\nimport { PanelModel } from 'app/features/dashboard/state';\nimport { SHARED_DASHBOARD_QUERY } from 'app/plugins/datasource/dashboard';\n\nimport { ShareQueryDataProvider } from '../scene/ShareQueryDataProvider';\n\nexport function createPanelDataProvider(panel: PanelModel): SceneDataProvider | undefined {\n // Skip setting query runner for panels without queries\n if (!panel.targets?.length) {\n return undefined;\n }\n\n // Skip setting query runner for panel plugins with skipDataQuery\n if (config.panels[panel.type]?.skipDataQuery) {\n return undefined;\n }\n\n let dataProvider: SceneDataProvider | undefined = undefined;\n\n if (panel.datasource?.uid === SHARED_DASHBOARD_QUERY) {\n dataProvider = new ShareQueryDataProvider({ query: panel.targets[0] });\n } else {\n dataProvider = new SceneQueryRunner({\n queries: panel.targets,\n maxDataPoints: panel.maxDataPoints ?? undefined,\n });\n }\n\n // Wrap inner data provider in a data transformer\n if (panel.transformations?.length) {\n dataProvider = new SceneDataTransformer({\n $data: dataProvider,\n transformations: panel.transformations,\n });\n }\n\n return dataProvider;\n}\n","import React from 'react';\n\nimport { SceneComponentProps, SceneObjectBase, SceneObjectState, VizPanel } from '@grafana/scenes';\nimport { PanelModel } from 'app/features/dashboard/state';\nimport { getLibraryPanel } from 'app/features/library-panels/state/api';\n\nimport { createPanelDataProvider } from '../utils/createPanelDataProvider';\n\ninterface LibraryVizPanelState extends SceneObjectState {\n // Library panels use title from dashboard JSON's panel model, not from library panel definition, hence we pass it.\n title: string;\n uid: string;\n panel?: VizPanel;\n}\n\nexport class LibraryVizPanel extends SceneObjectBase {\n static Component = LibraryPanelRenderer;\n\n constructor({ uid, title }: Pick) {\n super({ uid, title });\n\n this.addActivationHandler(this._onActivate);\n }\n\n private _onActivate = () => {\n this.loadLibraryPanelFromPanelModel();\n };\n\n private async loadLibraryPanelFromPanelModel() {\n const { title } = this.state;\n let vizPanel = new VizPanel({ title });\n try {\n const libPanel = await getLibraryPanel(this.state.uid, true);\n const libPanelModel = new PanelModel(libPanel.model);\n vizPanel.setState({\n options: libPanelModel.options ?? {},\n fieldConfig: libPanelModel.fieldConfig,\n pluginVersion: libPanelModel.pluginVersion,\n displayMode: libPanelModel.transparent ? 'transparent' : undefined,\n $data: createPanelDataProvider(libPanelModel),\n });\n } catch (err) {\n vizPanel.setState({\n pluginLoadError: 'Unable to load library panel: ' + this.state.uid,\n });\n }\n\n this.setState({ panel: vizPanel });\n }\n}\n\nfunction LibraryPanelRenderer({ model }: SceneComponentProps) {\n const { panel } = model.useState();\n\n if (!panel) {\n return null;\n }\n\n return ;\n}\n","import { locationUtil, PanelMenuItem } from '@grafana/data';\nimport { locationService, reportInteraction } from '@grafana/runtime';\nimport { sceneGraph, VizPanel, VizPanelMenu } from '@grafana/scenes';\nimport { contextSrv } from 'app/core/core';\nimport { t } from 'app/core/internationalization';\nimport { getExploreUrl } from 'app/core/utils/explore';\nimport { InspectTab } from 'app/features/inspector/types';\n\nimport { getDashboardUrl, getPanelIdForVizPanel, getQueryRunnerFor } from '../utils/utils';\n\nimport { DashboardScene } from './DashboardScene';\n\n/**\n * Behavior is called when VizPanelMenu is activated (ie when it's opened).\n */\nexport function panelMenuBehavior(menu: VizPanelMenu) {\n const asyncFunc = async () => {\n // hm.. add another generic param to SceneObject to specify parent type?\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const panel = menu.parent as VizPanel;\n const location = locationService.getLocation();\n const items: PanelMenuItem[] = [];\n const panelId = getPanelIdForVizPanel(panel);\n const dashboard = panel.getRoot();\n const panelPlugin = panel.getPlugin();\n const queryRunner = getQueryRunnerFor(panel);\n\n if (dashboard instanceof DashboardScene) {\n items.push({\n text: t('panel.header-menu.view', `View`),\n iconClassName: 'eye',\n shortcut: 'v',\n onClick: () => reportInteraction('dashboards_panelheader_menu', { item: 'view' }),\n href: locationUtil.getUrlForPartial(location, { viewPanel: panel.state.key }),\n });\n\n // We could check isEditing here but I kind of think this should always be in the menu,\n // and going into panel edit should make the dashboard go into edit mode is it's not already\n items.push({\n text: t('panel.header-menu.edit', `Edit`),\n iconClassName: 'eye',\n shortcut: 'v',\n onClick: () => reportInteraction('dashboards_panelheader_menu', { item: 'edit' }),\n href: getDashboardUrl({\n uid: dashboard.state.uid,\n subPath: `/panel-edit/${panelId}`,\n currentQueryParams: location.search,\n }),\n });\n }\n\n if (contextSrv.hasAccessToExplore() && !panelPlugin?.meta.skipDataQuery && queryRunner) {\n const timeRange = sceneGraph.getTimeRange(panel);\n\n items.push({\n text: t('panel.header-menu.explore', `Explore`),\n iconClassName: 'compass',\n shortcut: 'p x',\n onClick: () => reportInteraction('dashboards_panelheader_menu', { item: 'explore' }),\n href: await getExploreUrl({\n queries: queryRunner.state.queries,\n dsRef: queryRunner.state.datasource,\n timeRange: timeRange.state.value,\n scopedVars: { __sceneObject: { value: panel } },\n }),\n });\n }\n\n items.push({\n text: t('panel.header-menu.inspect', `Inspect`),\n iconClassName: 'info-circle',\n shortcut: 'i',\n onClick: () => reportInteraction('dashboards_panelheader_menu', { item: 'inspect', tab: InspectTab.Data }),\n href: locationUtil.getUrlForPartial(location, { inspect: panel.state.key }),\n });\n\n menu.setState({ items });\n };\n\n asyncFunc();\n}\n","import {\n ConstantVariableModel,\n CustomVariableModel,\n DataSourceVariableModel,\n QueryVariableModel,\n VariableModel,\n} from '@grafana/data';\nimport {\n VizPanel,\n SceneTimePicker,\n SceneGridLayout,\n SceneGridRow,\n SceneTimeRange,\n SceneVariableSet,\n VariableValueSelectors,\n SceneVariable,\n CustomVariable,\n DataSourceVariable,\n QueryVariable,\n ConstantVariable,\n SceneRefreshPicker,\n SceneGridItem,\n SceneObject,\n SceneControlsSpacer,\n VizPanelMenu,\n behaviors,\n VizPanelState,\n SceneGridItemLike,\n} from '@grafana/scenes';\nimport { DashboardModel, PanelModel } from 'app/features/dashboard/state';\nimport { DashboardDTO } from 'app/types';\n\nimport { DashboardScene } from '../scene/DashboardScene';\nimport { LibraryVizPanel } from '../scene/LibraryVizPanel';\nimport { panelMenuBehavior } from '../scene/PanelMenuBehavior';\nimport { PanelRepeaterGridItem } from '../scene/PanelRepeaterGridItem';\nimport { PanelTimeRange } from '../scene/PanelTimeRange';\nimport { RowRepeaterBehavior } from '../scene/RowRepeaterBehavior';\nimport { createPanelDataProvider } from '../utils/createPanelDataProvider';\nimport { getVizPanelKeyForPanelId } from '../utils/utils';\n\nexport interface DashboardLoaderState {\n dashboard?: DashboardScene;\n isLoading?: boolean;\n loadError?: string;\n}\n\nexport function transformSaveModelToScene(rsp: DashboardDTO): DashboardScene {\n // Just to have migrations run\n const oldModel = new DashboardModel(rsp.dashboard, rsp.meta, {\n autoMigrateOldPanels: true,\n });\n\n return createDashboardSceneFromDashboardModel(oldModel);\n}\n\nexport function createSceneObjectsForPanels(oldPanels: PanelModel[]): SceneGridItemLike[] {\n // collects all panels and rows\n const panels: SceneGridItemLike[] = [];\n\n // indicates expanded row that's currently processed\n let currentRow: PanelModel | null = null;\n // collects panels in the currently processed, expanded row\n let currentRowPanels: SceneGridItemLike[] = [];\n\n for (const panel of oldPanels) {\n if (panel.type === 'row') {\n if (!currentRow) {\n if (Boolean(panel.collapsed)) {\n // collapsed rows contain their panels within the row model\n panels.push(createRowFromPanelModel(panel, []));\n } else {\n // indicate new row to be processed\n currentRow = panel;\n }\n } else {\n // when a row has been processed, and we hit a next one for processing\n if (currentRow.id !== panel.id) {\n // commit previous row panels\n panels.push(createRowFromPanelModel(currentRow, currentRowPanels));\n\n currentRow = panel;\n currentRowPanels = [];\n }\n }\n } else if (panel.libraryPanel?.uid && !('model' in panel.libraryPanel)) {\n const gridItem = new SceneGridItem({\n body: new LibraryVizPanel({\n title: panel.title,\n uid: panel.libraryPanel.uid,\n }),\n y: panel.gridPos.y,\n x: panel.gridPos.x,\n width: panel.gridPos.w,\n height: panel.gridPos.h,\n });\n panels.push(gridItem);\n } else {\n const panelObject = buildGridItemForPanel(panel);\n\n // when processing an expanded row, collect its panels\n if (currentRow) {\n currentRowPanels.push(panelObject);\n } else {\n panels.push(panelObject);\n }\n }\n }\n\n // commit a row if it's the last one\n if (currentRow) {\n panels.push(createRowFromPanelModel(currentRow, currentRowPanels));\n }\n\n return panels;\n}\n\nfunction createRowFromPanelModel(row: PanelModel, content: SceneGridItemLike[]): SceneGridItemLike {\n if (Boolean(row.collapsed)) {\n if (row.panels) {\n content = row.panels.map(buildGridItemForPanel);\n }\n }\n\n let behaviors: SceneObject[] | undefined;\n let children = content;\n\n if (row.repeat) {\n // For repeated rows the children are stored in the behavior\n children = [];\n behaviors = [\n new RowRepeaterBehavior({\n variableName: row.repeat,\n sources: content,\n }),\n ];\n }\n\n return new SceneGridRow({\n key: getVizPanelKeyForPanelId(row.id),\n title: row.title,\n y: row.gridPos.y,\n isCollapsed: row.collapsed,\n children: children,\n $behaviors: behaviors,\n });\n}\n\nexport function createDashboardSceneFromDashboardModel(oldModel: DashboardModel) {\n let variables: SceneVariableSet | undefined = undefined;\n\n if (oldModel.templating?.list?.length) {\n const variableObjects = oldModel.templating.list\n .map((v) => {\n try {\n return createSceneVariableFromVariableModel(v);\n } catch (err) {\n console.error(err);\n return null;\n }\n })\n // TODO: Remove filter\n // Added temporarily to allow skipping non-compatible variables\n .filter((v): v is SceneVariable => Boolean(v));\n\n variables = new SceneVariableSet({\n variables: variableObjects,\n });\n }\n\n const controls: SceneObject[] = [\n new VariableValueSelectors({}),\n new SceneControlsSpacer(),\n new SceneTimePicker({}),\n new SceneRefreshPicker({\n refresh: oldModel.refresh,\n intervals: oldModel.timepicker.refresh_intervals,\n }),\n ];\n\n return new DashboardScene({\n title: oldModel.title,\n uid: oldModel.uid,\n meta: oldModel.meta,\n body: new SceneGridLayout({\n isLazy: true,\n children: createSceneObjectsForPanels(oldModel.panels),\n }),\n $timeRange: new SceneTimeRange(oldModel.time),\n $variables: variables,\n $behaviors: [\n new behaviors.CursorSync({\n sync: oldModel.graphTooltip,\n }),\n ],\n controls: controls,\n });\n}\n\nexport function createSceneVariableFromVariableModel(variable: VariableModel): SceneVariable {\n const commonProperties = {\n name: variable.name,\n label: variable.label,\n };\n if (isCustomVariable(variable)) {\n return new CustomVariable({\n ...commonProperties,\n value: variable.current.value,\n text: variable.current.text,\n description: variable.description,\n query: variable.query,\n isMulti: variable.multi,\n allValue: variable.allValue || undefined,\n includeAll: variable.includeAll,\n defaultToAll: Boolean(variable.includeAll),\n skipUrlSync: variable.skipUrlSync,\n hide: variable.hide,\n });\n } else if (isQueryVariable(variable)) {\n return new QueryVariable({\n ...commonProperties,\n value: variable.current.value,\n text: variable.current.text,\n description: variable.description,\n query: variable.query,\n datasource: variable.datasource,\n sort: variable.sort,\n refresh: variable.refresh,\n regex: variable.regex,\n allValue: variable.allValue || undefined,\n includeAll: variable.includeAll,\n defaultToAll: Boolean(variable.includeAll),\n isMulti: variable.multi,\n skipUrlSync: variable.skipUrlSync,\n hide: variable.hide,\n });\n } else if (isDataSourceVariable(variable)) {\n return new DataSourceVariable({\n ...commonProperties,\n value: variable.current.value,\n text: variable.current.text,\n description: variable.description,\n regex: variable.regex,\n pluginId: variable.query,\n allValue: variable.allValue || undefined,\n includeAll: variable.includeAll,\n defaultToAll: Boolean(variable.includeAll),\n skipUrlSync: variable.skipUrlSync,\n isMulti: variable.multi,\n hide: variable.hide,\n });\n } else if (isConstantVariable(variable)) {\n return new ConstantVariable({\n ...commonProperties,\n description: variable.description,\n value: variable.query,\n skipUrlSync: variable.skipUrlSync,\n hide: variable.hide,\n });\n } else {\n throw new Error(`Scenes: Unsupported variable type ${variable.type}`);\n }\n}\n\nexport function buildGridItemForPanel(panel: PanelModel): SceneGridItemLike {\n const vizPanelState: VizPanelState = {\n key: getVizPanelKeyForPanelId(panel.id),\n title: panel.title,\n pluginId: panel.type,\n options: panel.options ?? {},\n fieldConfig: panel.fieldConfig,\n pluginVersion: panel.pluginVersion,\n displayMode: panel.transparent ? 'transparent' : undefined,\n // To be replaced with it's own option persited option instead derived\n hoverHeader: !panel.title && !panel.timeFrom && !panel.timeShift,\n $data: createPanelDataProvider(panel),\n menu: new VizPanelMenu({\n $behaviors: [panelMenuBehavior],\n }),\n };\n\n if (panel.timeFrom || panel.timeShift) {\n vizPanelState.$timeRange = new PanelTimeRange({\n timeFrom: panel.timeFrom,\n timeShift: panel.timeShift,\n hideTimeOverride: panel.hideTimeOverride,\n });\n }\n\n if (panel.repeat) {\n const repeatDirection = panel.repeatDirection ?? 'h';\n\n return new PanelRepeaterGridItem({\n key: `grid-item-${panel.id}`,\n x: panel.gridPos.x,\n y: panel.gridPos.y,\n width: repeatDirection === 'h' ? 24 : panel.gridPos.w,\n height: panel.gridPos.h,\n itemHeight: panel.gridPos.h,\n source: new VizPanel(vizPanelState),\n variableName: panel.repeat,\n repeatedPanels: [],\n repeatDirection: panel.repeatDirection,\n maxPerRow: panel.maxPerRow,\n });\n }\n\n return new SceneGridItem({\n key: `grid-item-${panel.id}`,\n x: panel.gridPos.x,\n y: panel.gridPos.y,\n width: panel.gridPos.w,\n height: panel.gridPos.h,\n body: new VizPanel(vizPanelState),\n });\n}\n\nconst isCustomVariable = (v: VariableModel): v is CustomVariableModel => v.type === 'custom';\nconst isQueryVariable = (v: VariableModel): v is QueryVariableModel => v.type === 'query';\nconst isDataSourceVariable = (v: VariableModel): v is DataSourceVariableModel => v.type === 'datasource';\nconst isConstantVariable = (v: VariableModel): v is ConstantVariableModel => v.type === 'constant';\n","import { UrlQueryMap, urlUtil } from '@grafana/data';\nimport { locationSearchToObject } from '@grafana/runtime';\nimport {\n MultiValueVariable,\n SceneDataTransformer,\n sceneGraph,\n SceneObject,\n SceneQueryRunner,\n VizPanel,\n} from '@grafana/scenes';\n\nimport { DashboardScene } from '../scene/DashboardScene';\n\nexport function getVizPanelKeyForPanelId(panelId: number) {\n return `panel-${panelId}`;\n}\n\nexport function getPanelIdForVizPanel(panel: SceneObject): number {\n return parseInt(panel.state.key!.replace('panel-', ''), 10);\n}\n\n/**\n * This will also try lookup based on panelId\n */\nexport function findVizPanelByKey(scene: SceneObject, key: string | undefined): VizPanel | null {\n if (!key) {\n return null;\n }\n\n const panel = findVizPanelInternal(scene, key);\n if (panel) {\n return panel;\n }\n\n // Also try to find by panel id\n const id = parseInt(key, 10);\n if (isNaN(id)) {\n return null;\n }\n\n return findVizPanelInternal(scene, getVizPanelKeyForPanelId(id));\n}\n\nfunction findVizPanelInternal(scene: SceneObject, key: string | undefined): VizPanel | null {\n if (!key) {\n return null;\n }\n\n const panel = sceneGraph.findObject(scene, (obj) => obj.state.key === key);\n if (panel) {\n if (panel instanceof VizPanel) {\n return panel;\n } else {\n throw new Error(`Found panel with key ${key} but it was not a VizPanel`);\n }\n }\n\n return null;\n}\n\n/**\n * Force re-render children. This is useful in some edge case scenarios when\n * children deep down the scene graph needs to be re-rendered when some parent state change.\n *\n * Example could be isEditing bool flag or a layout IsDraggable state flag.\n *\n * @param model The model whose children should be re-rendered. It does not force render this model, only the children.\n * @param recursive if it should keep force rendering down to leaf nodess\n */\nexport function forceRenderChildren(model: SceneObject, recursive?: boolean) {\n model.forEachChild((child) => {\n if (!child.isActive) {\n return;\n }\n\n child.forceRender();\n forceRenderChildren(child, recursive);\n });\n}\n\nexport interface DashboardUrlOptions {\n uid?: string;\n subPath?: string;\n updateQuery?: UrlQueryMap;\n /**\n * Set to location.search to preserve current params\n */\n currentQueryParams: string;\n}\n\nexport function getDashboardUrl(options: DashboardUrlOptions) {\n const url = `/scenes/dashboard/${options.uid}${options.subPath ?? ''}`;\n\n const params = options.currentQueryParams ? locationSearchToObject(options.currentQueryParams) : {};\n\n if (options.updateQuery) {\n for (const key of Object.keys(options.updateQuery)) {\n // removing params with null | undefined\n if (options.updateQuery[key] === null || options.updateQuery[key] === undefined) {\n delete params[key];\n } else {\n params[key] = options.updateQuery[key];\n }\n }\n }\n\n return urlUtil.renderUrl(url, params);\n}\n\nexport function getMultiVariableValues(variable: MultiValueVariable) {\n const { value, text, options } = variable.state;\n\n if (variable.hasAllValue()) {\n return {\n values: options.map((o) => o.value),\n texts: options.map((o) => o.label),\n };\n }\n\n return {\n values: Array.isArray(value) ? value : [value],\n texts: Array.isArray(text) ? text : [text],\n };\n}\n\nexport function getDashboardSceneFor(sceneObject: SceneObject): DashboardScene {\n const root = sceneObject.getRoot();\n if (root instanceof DashboardScene) {\n return root;\n }\n\n throw new Error('SceneObject root is not a DashboardScene');\n}\n\nexport function getQueryRunnerFor(sceneObject: SceneObject | undefined): SceneQueryRunner | undefined {\n if (!sceneObject) {\n return undefined;\n }\n\n if (sceneObject.state.$data instanceof SceneQueryRunner) {\n return sceneObject.state.$data;\n }\n\n if (sceneObject.state.$data instanceof SceneDataTransformer) {\n return getQueryRunnerFor(sceneObject.state.$data);\n }\n\n return undefined;\n}\n","import { useMemo } from 'react';\nimport useAsync from 'react-use/lib/useAsync';\n\nimport { DataQueryError, DataSourceApi, PanelData, PanelPlugin } from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { t } from 'app/core/internationalization';\nimport { DashboardModel, PanelModel } from 'app/features/dashboard/state';\nimport { InspectTab } from 'app/features/inspector/types';\n\nimport { supportsDataQuery } from '../PanelEditor/utils';\n\n/**\n * Given PanelData return first data source supporting metadata inspector\n */\nexport const useDatasourceMetadata = (data?: PanelData) => {\n const state = useAsync(async () => getDataSourceWithInspector(data), [data]);\n return state.value;\n};\n\nexport async function getDataSourceWithInspector(data?: PanelData): Promise {\n const targets = data?.request?.targets || [];\n\n if (data && data.series && targets.length) {\n for (const frame of data.series) {\n if (frame.meta && frame.meta.custom) {\n // get data source from first query\n const dataSource = await getDataSourceSrv().get(targets[0].datasource);\n if (dataSource && dataSource.components?.MetadataInspector) {\n return dataSource;\n }\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Configures tabs for PanelInspector\n */\nexport const useInspectTabs = (\n panel: PanelModel,\n dashboard: DashboardModel,\n plugin: PanelPlugin | undefined | null,\n error?: DataQueryError,\n metaDs?: DataSourceApi\n) => {\n return useMemo(() => {\n const tabs = [];\n if (supportsDataQuery(plugin)) {\n tabs.push({ label: t('dashboard.inspect.data-tab', 'Data'), value: InspectTab.Data });\n tabs.push({ label: t('dashboard.inspect.stats-tab', 'Stats'), value: InspectTab.Stats });\n }\n\n if (metaDs) {\n tabs.push({ label: t('dashboard.inspect.meta-tab', 'Meta data'), value: InspectTab.Meta });\n }\n\n tabs.push({ label: t('dashboard.inspect.json-tab', 'JSON'), value: InspectTab.JSON });\n\n if (error && error.message) {\n tabs.push({ label: t('dashboard.inspect.error-tab', 'Error'), value: InspectTab.Error });\n }\n\n if (dashboard.meta.canEdit && supportsDataQuery(plugin)) {\n tabs.push({ label: t('dashboard.inspect.query-tab', 'Query'), value: InspectTab.Query });\n }\n return tabs;\n }, [plugin, metaDs, dashboard, error]);\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar tslib_1 = require(\"tslib\");\nvar react_1 = require(\"react\");\nvar useAsyncFn_1 = tslib_1.__importDefault(require(\"./useAsyncFn\"));\nfunction useAsync(fn, deps) {\n if (deps === void 0) { deps = []; }\n var _a = useAsyncFn_1.default(fn, deps, {\n loading: true,\n }), state = _a[0], callback = _a[1];\n react_1.useEffect(function () {\n callback();\n }, [callback]);\n return state;\n}\nexports.default = useAsync;\n"],"names":["StateManagerBase","state","useLatestState","update","observerOrNext","model","forceUpdate","s","NavToolbarActions","dashboard","actions","isEditing","viewPanelKey","isDirty","uid","toolbarActions","action","DashNavButton","NavToolbarSeparator","Button","AppChromeUpdate","DashboardSceneRenderer","controls","viewPanelId","drawer","styles","getStyles","location","pageNav","bodyToRender","Page","CustomScrollbar","control","theme","transformSceneToSaveModel","scene","timeRange","body","panels","child","gridItemToPanel","gridRowToSaveModel","gridItem","vizPanel","x","y","w","h","PanelRepeaterGridItem","panel","panelTime","PanelTimeRange","gridRow","panelsArray","rowPanel","behavior","RowRepeaterBehavior","panelsInsideRow","SaveDashboardDrawer","initialState","initialScene","DashboardScene","initialSaveModel","changedSaveModel","diff","Drawer","SaveDashboardDiff","options","dataProvider","data","getDataProviderToSubscribeTo","InspectDataTab","hasTransformations","withTransforms","InspectJsonTab","getJsonText","value","jsonObj","panelModel","newState","hasGridPosChanged","hasQueriesChanged","show","jsonText","selectors","Field","Select","v","height","CodeEditor","objToStringify","a","b","InspectMetaDataTab","panelRef","dataSource","Inspector","InspectQueryTab","queryRunner","QueryInspector","PanelInspectDrawer","retry","plugin","tabs","dsWithInspector","PanelInspectRenderer","pluginNotLoaded","queryParams","urlTab","currentTab","tab","TabsBar","Tab","Alert","DashboardSceneUrlSync","_scene","values","inspectPanelId","event","prevState","changedVariables","dependencyChanged","itemCount","stateChange","itemHeight","rowCount","variable","panelToRepeat","texts","repeatedPanels","index","clone","direction","maxPerRow","layoutStyle","useLayoutStyle","itemStyle","mobileHeight","columnCount","overrideResult","parentTimeRange","timeFrom","timeShift","newTimeData","timeFromInterpolated","timeFromInfo","timeShiftInterpolated","from","to","PanelTimeRangeRenderer","timeInfo","hideTimeOverride","layout","rowToRepeat","rows","rowContentHeight","getRowContentHeight","maxYOfRows","children","source","itemY","itemClone","ensureUniqueKeys","rowClone","updateLayout","text","sourceRowY","maxY","minY","allChildren","getLayoutChildrenFilterOutRepeatClones","newChildren","childrenAfter","firstChildAfterY","item","rowIndex","ShareQueryDataProvider","query","keyToFind","findObjectInScene","sourceData","check","found","maybe","createPanelDataProvider","config","LibraryVizPanel","title","libPanel","libPanelModel","LibraryPanelRenderer","panelMenuBehavior","menu","items","panelId","panelPlugin","transformSaveModelToScene","rsp","oldModel","createDashboardSceneFromDashboardModel","createSceneObjectsForPanels","oldPanels","currentRow","currentRowPanels","createRowFromPanelModel","panelObject","buildGridItemForPanel","row","content","behaviors","variables","variableObjects","createSceneVariableFromVariableModel","err","commonProperties","isCustomVariable","isQueryVariable","isDataSourceVariable","isConstantVariable","vizPanelState","repeatDirection","getVizPanelKeyForPanelId","getPanelIdForVizPanel","findVizPanelByKey","key","findVizPanelInternal","id","obj","forceRenderChildren","recursive","getDashboardUrl","url","params","getMultiVariableValues","o","getDashboardSceneFor","sceneObject","root","getQueryRunnerFor","useDatasourceMetadata","getDataSourceWithInspector","targets","frame","useInspectTabs","error","metaDs","tslib_1","react_1","useAsyncFn_1","useAsync","fn","deps","_a","callback","exports"],"sourceRoot":""}