{"version":3,"file":"SoloPanelPage.e0f968452652018b2f31.js","mappings":"yUAQO,SAASA,EAAaC,EAA2BC,EAA6D,CACnH,KAAM,CAACC,EAAOC,CAAQ,KAAI,YAAmB,EACvC,CAACC,EAAOC,CAAQ,KAAI,YAA6B,EAEvD,sBAAU,IAAM,CACS,IAAI,KAAe,EAC3B,SAASL,CAAS,EAEjC,MAAMM,EAAUN,EAAU,SAAS,EAEnC,IAAIE,EAAyB,KAC7B,GAAI,CACFA,KAAQ,MAAkBF,EAAWC,CAAO,CAC9C,MAAY,CAEZ,CAEA,OAAIC,GACFK,EAAgBL,CAAK,EACrBC,EAASD,CAAK,MACL,MAAaD,CAAO,EAC7BO,EAAgBR,EAAWC,CAAO,EAAE,KAAMC,GAAU,CAC9CA,EACFC,EAASD,CAAK,EAEdG,EAAS,iBAAiB,CAE9B,CAAC,EAEDA,EAAS,iBAAiB,EAGrBC,CACT,EAAG,CAACN,EAAWC,CAAO,CAAC,EAEhB,CAACC,EAAOE,CAAK,CACtB,CAEA,SAASG,EAAgBL,EAAiB,CACxC,IAAIO,EAASP,EAAM,OAEnB,KAAOO,GAAU,CAACA,EAAO,UACvBA,EAAO,SAAS,EAChBA,EAASA,EAAO,MAEpB,CAEA,SAASD,EAAgBR,EAA2BC,EAAgD,CAClG,OAAO,IAAI,QAASS,GAAY,CAC9BV,EAAU,iBAAiB,IAAgC,IAAM,CAC/D,MAAME,KAAQ,MAAkBF,EAAWC,CAAO,EAC9CC,EACFQ,EAAQR,CAAK,EAGbF,EAAU,MAAM,KAAK,oBAAoB,CAE7C,CAAC,EAEDA,EAAU,MAAM,KAAK,oBAAoB,CAC3C,CAAC,CACH,CC7CO,SAASW,EAAc,CAAE,YAAAC,CAAY,EAAU,CACpD,MAAMC,KAAe,MAAkC,EACjD,CAAE,UAAAb,CAAU,EAAIa,EAAa,SAAS,EACtC,CAAE,IAAAC,EAAM,GAAI,KAAAC,EAAM,KAAAC,CAAK,KAAI,KAAU,EAO3C,SALA,aAAU,KACRH,EAAa,cAAc,CAAE,IAAAC,EAAK,KAAAC,EAAM,KAAAC,EAAM,MAAO,kBAAgB,QAAS,CAAC,EACxE,IAAMH,EAAa,WAAW,GACpC,CAACA,EAAcD,EAAaE,EAAKC,EAAMC,CAAI,CAAC,EAE1CJ,EAAY,QAIZZ,KAKH,OAAC,KAAsB,CAAC,MAAOA,EAC7B,mBAACiB,EAAA,CAAkB,UAAAjB,EAAsB,QAASY,EAAY,QAAS,EACzE,KANO,OAACM,EAAA,EAAU,EAAC,KAJZ,OAACC,EAAA,EAAc,CAAC,OAAO,OAAQ,EAY1C,CAEA,QAAeR,EAER,SAASM,EAAkB,CAAE,UAAAjB,EAAW,QAAAC,CAAQ,EAAmD,CACxG,KAAM,CAACC,EAAOE,CAAK,EAAIL,EAAaC,EAAWC,CAAO,EAChD,CAAE,SAAAmB,CAAS,EAAIpB,EAAU,SAAS,EAClCqB,EAAgBD,GAAU,SAAS,GAAG,cACtCE,KAAS,MAAWC,CAAS,EAMnC,SAJA,aAAU,IACDF,GAAe,SAAS,EAC9B,CAACA,CAAa,CAAC,EAEdjB,KACK,OAACoB,EAAA,EAAK,CAAC,MAAOpB,CAAA,CAAO,EAGzBF,KASH,OAAC,OAAI,UAAWoB,EAAO,UACrB,mBAACpB,EAAM,UAAN,CAAgB,MAAOA,CAAA,CAAO,EACjC,KATE,QAAC,QAAK,wBACI,OAACuB,EAAA,EAAO,EAAC,GACnB,CASN,CAEA,MAAMF,EAAaG,IAA0B,CAC3C,aAAW,OAAI,CACb,SAAU,QACV,OAAQ,EACR,MAAO,EACP,OAAQ,EACR,KAAM,EACN,IAAK,EACL,MAAO,OACP,OAAQ,MACV,CAAC,CACH,E","sources":["webpack://grafana/./public/app/features/dashboard-scene/solo/useSoloPanel.ts","webpack://grafana/./public/app/features/dashboard-scene/solo/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 = '', type, slug } = useParams();\n\n useEffect(() => {\n stateManager.loadDashboard({ uid, type, slug, route: DashboardRoutes.Embedded });\n return () => stateManager.clearState();\n }, [stateManager, queryParams, uid, type, slug]);\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 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"],"names":["useSoloPanel","dashboard","panelId","panel","setPanel","error","setError","cleanUp","activateParents","findRepeatClone","parent","resolve","SoloPanelPage","queryParams","stateManager","uid","type","slug","SoloPanelRenderer","PageLoader","EntityNotFound","controls","refreshPicker","styles","getStyles","Alert","Spinner","theme"],"sourceRoot":""}