{"version":3,"file":"SoloPanelPage.4ef1e2a077d3dd8f82a8.js","mappings":"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","sources":["webpack://grafana/./public/app/features/dashboard-scene/solo/useSoloPanel.ts","webpack://grafana/./public/app/features/dashboard-scene/solo/SoloPanelPage.tsx","webpack://grafana/./public/app/features/dashboard/containers/SoloPanelPage.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\n\nimport { VizPanel, UrlSyncManager } from '@grafana/scenes';\n\nimport { DashboardScene } from '../scene/DashboardScene';\nimport { DashboardRepeatsProcessedEvent } from '../scene/types';\nimport { findVizPanelByKey, isPanelClone } from '../utils/utils';\n\nexport function useSoloPanel(dashboard: DashboardScene, panelId: string): [VizPanel | undefined, string | undefined] {\n const [panel, setPanel] = useState();\n const [error, setError] = useState();\n\n useEffect(() => {\n const urlSyncManager = new UrlSyncManager();\n urlSyncManager.initSync(dashboard);\n\n const cleanUp = dashboard.activate();\n\n let panel: VizPanel | null = null;\n try {\n panel = findVizPanelByKey(dashboard, panelId);\n } catch (e) {\n // do nothing, just the panel is not found or not a VizPanel\n }\n\n if (panel) {\n activateParents(panel);\n setPanel(panel);\n } else if (isPanelClone(panelId)) {\n findRepeatClone(dashboard, panelId).then((panel) => {\n if (panel) {\n setPanel(panel);\n } else {\n setError('Panel not found');\n }\n });\n } else {\n setError('Panel not found');\n }\n\n return cleanUp;\n }, [dashboard, panelId]);\n\n return [panel, error];\n}\n\nfunction activateParents(panel: VizPanel) {\n let parent = panel.parent;\n\n while (parent && !parent.isActive) {\n parent.activate();\n parent = parent.parent;\n }\n}\n\nfunction findRepeatClone(dashboard: DashboardScene, panelId: string): Promise {\n return new Promise((resolve) => {\n dashboard.subscribeToEvent(DashboardRepeatsProcessedEvent, () => {\n const panel = findVizPanelByKey(dashboard, panelId);\n if (panel) {\n resolve(panel);\n } else {\n // If rows are repeated they could add new panel repeaters that needs to be activated\n dashboard.state.body.activateRepeaters?.();\n }\n });\n\n dashboard.state.body.activateRepeaters?.();\n });\n}\n","// Libraries\nimport { css } from '@emotion/css';\nimport { useEffect } from 'react';\nimport { useParams } from 'react-router-dom-v5-compat';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { UrlSyncContextProvider } from '@grafana/scenes';\nimport { Alert, Spinner, useStyles2 } from '@grafana/ui';\nimport PageLoader from 'app/core/components/PageLoader/PageLoader';\nimport { EntityNotFound } from 'app/core/components/PageNotFound/EntityNotFound';\nimport { GrafanaRouteComponentProps } from 'app/core/navigation/types';\nimport { DashboardPageRouteParams } from 'app/features/dashboard/containers/types';\nimport { DashboardRoutes } from 'app/types';\n\nimport { getDashboardScenePageStateManager } from '../pages/DashboardScenePageStateManager';\nimport { DashboardScene } from '../scene/DashboardScene';\n\nimport { useSoloPanel } from './useSoloPanel';\n\nexport interface Props extends GrafanaRouteComponentProps {}\n\n/**\n * Used for iframe embedding and image rendering of single panels\n */\nexport function SoloPanelPage({ queryParams }: Props) {\n const stateManager = getDashboardScenePageStateManager();\n const { dashboard } = stateManager.useState();\n const { uid = '' } = useParams();\n\n useEffect(() => {\n stateManager.loadDashboard({ uid, route: DashboardRoutes.Embedded });\n return () => stateManager.clearState();\n }, [stateManager, queryParams, uid]);\n\n if (!queryParams.panelId) {\n return ;\n }\n\n if (!dashboard) {\n return ;\n }\n\n return (\n \n \n \n );\n}\n\nexport default SoloPanelPage;\n\nexport function SoloPanelRenderer({ dashboard, panelId }: { dashboard: DashboardScene; panelId: string }) {\n const [panel, error] = useSoloPanel(dashboard, panelId);\n const { controls } = dashboard.useState();\n const refreshPicker = controls?.useState()?.refreshPicker;\n\n const styles = useStyles2(getStyles);\n\n useEffect(() => {\n return refreshPicker?.activate();\n }, [refreshPicker]);\n\n if (error) {\n return ;\n }\n\n if (!panel) {\n return (\n \n Loading \n \n );\n }\n\n return (\n
\n \n
\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n container: css({\n position: 'fixed',\n bottom: 0,\n right: 0,\n margin: 0,\n left: 0,\n top: 0,\n width: '100%',\n height: '100%',\n }),\n});\n","import { css } from '@emotion/css';\nimport { useCallback, useEffect, useState } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\nimport { useParams } from 'react-router-dom-v5-compat';\nimport AutoSizer from 'react-virtualized-auto-sizer';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Alert, useStyles2 } from '@grafana/ui';\nimport { GrafanaRouteComponentProps } from 'app/core/navigation/types';\nimport { DashboardModel } from 'app/features/dashboard/state/DashboardModel';\nimport { PanelModel } from 'app/features/dashboard/state/PanelModel';\nimport { StoreState } from 'app/types';\n\nimport { useGrafana } from '../../../core/context/GrafanaContext';\nimport { DashboardPanel } from '../dashgrid/DashboardPanel';\nimport { initDashboard } from '../state/initDashboard';\n\nexport interface DashboardPageRouteParams {\n uid?: string;\n type?: string;\n slug?: string;\n}\n\nconst mapStateToProps = (state: StoreState) => ({\n dashboard: state.dashboard.getModel(),\n});\n\nconst mapDispatchToProps = {\n initDashboard,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type Props = GrafanaRouteComponentProps &\n ConnectedProps;\n\nexport interface State {\n panel: PanelModel | null;\n notFound: boolean;\n}\n\nexport const SoloPanelPage = ({ route, queryParams, dashboard, initDashboard }: Props) => {\n const [panel, setPanel] = useState(null);\n const [notFound, setNotFound] = useState(false);\n const { keybindings } = useGrafana();\n\n const { slug, uid, type } = useParams();\n\n useEffect(() => {\n initDashboard({\n urlSlug: slug,\n urlUid: uid,\n urlType: type,\n routeName: route.routeName,\n fixUrl: false,\n keybindingSrv: keybindings,\n });\n }, [slug, uid, type, route.routeName, initDashboard, keybindings]);\n\n const getPanelId = useCallback(() => {\n return parseInt(queryParams.panelId ?? '0', 10);\n }, [queryParams.panelId]);\n\n useEffect(() => {\n if (dashboard) {\n const panel = dashboard.getPanelByUrlId(queryParams.panelId);\n\n if (!panel) {\n setNotFound(true);\n return;\n }\n\n if (panel) {\n dashboard.exitViewPanel(panel);\n }\n setPanel(panel);\n dashboard.initViewPanel(panel);\n }\n }, [dashboard, queryParams.panelId]);\n\n return (\n \n );\n};\n\nexport interface SoloPanelProps extends State {\n dashboard: DashboardModel | null;\n panelId: number;\n timezone?: string;\n}\n\nexport const SoloPanel = ({ dashboard, notFound, panel, panelId, timezone }: SoloPanelProps) => {\n const styles = useStyles2(getStyles);\n if (notFound) {\n return ;\n }\n\n if (!panel || !dashboard) {\n return
Loading & initializing dashboard
;\n }\n\n return (\n
\n \n {({ width, height }) => {\n if (width === 0) {\n return null;\n }\n return (\n \n );\n }}\n \n
\n );\n};\n\nexport default connector(SoloPanelPage);\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n container: css({\n position: 'fixed',\n bottom: 0,\n right: 0,\n margin: 0,\n left: 0,\n top: 0,\n width: '100%',\n height: '100%',\n }),\n});\n"],"names":["useSoloPanel","dashboard","panelId","panel","setPanel","error","setError","cleanUp","activateParents","findRepeatClone","parent","resolve","SoloPanelPage","queryParams","stateManager","uid","SoloPanelRenderer","PageLoader","EntityNotFound","controls","refreshPicker","styles","getStyles","Alert","Spinner","theme","mapStateToProps","state","mapDispatchToProps","connector","route","initDashboard","notFound","setNotFound","keybindings","slug","type","getPanelId","SoloPanel","timezone","width","height"],"sourceRoot":""}