{"version":3,"sources":["webpack:///./public/app/features/inspector/types.ts","webpack:///./public/app/features/dashboard/state/analyticsProcessor.ts","webpack:///./public/app/features/dashboard/state/initDashboard.ts","webpack:///./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderCorner.tsx","webpack:///./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderNotice.tsx","webpack:///./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderNotices.tsx","webpack:///./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderMenuTrigger.tsx","webpack:///./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderLoadingIndicator.tsx","webpack:///./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderMenuProvider.tsx","webpack:///./public/app/features/dashboard/utils/getPanelMenu.ts","webpack:///./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderMenu.tsx","webpack:///./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderMenuWrapper.tsx","webpack:///./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeader.tsx","webpack:///./public/app/features/dashboard/utils/loadSnapshotData.ts","webpack:///./public/app/features/dashboard/dashgrid/PanelChrome.tsx","webpack:///./public/app/features/dashboard/dashgrid/PanelChromeAngular.tsx","webpack:///./public/app/features/dashboard/dashgrid/DashboardPanel.tsx"],"names":["InspectTab","emitDashboardViewEvent","dashboard","eventData","dashboardId","id","dashboardName","title","dashboardUid","uid","folderName","meta","folderTitle","eventName","MetaAnalyticsEventName","DashboardView","reportMetaAnalytics","redirectToNewUrl","slug","dispatch","currentPath","backendSrv","getDashboardBySlug","res","newUrl","url","indexOf","replace","locationUtil","stripBaseFromUrl","updateLocation","path","partial","fetchDashboard","args","getState","routeInfo","DashboardRouteInfo","Home","Normal","New","get","dashDTO","redirectUri","canSave","canShare","canStar","urlType","urlSlug","location","loaderSrv","$injector","loadDashboard","urlUid","fixUrl","dashboardUrl","getNewDashboardModelData","urlFolderId","message","cancelled","dashboardInitFailed","error","console","initDashboard","dashboardInitFetching","setTimeout","getModel","dashboardInitSlow","dashboardInitServices","DashboardModel","storeState","query","orgId","user","timeSrv","annotationsSrv","keybindingSrv","unsavedChangesSrv","dashboardSrv","init","modifiedQueries","panelId","queries","fromExplore","initVariablesTransaction","templating","transaction","initPhase","DashboardInitPhase","Services","processRepeats","updateSubmenuVisibility","queryParams","autofitpanels","autoFitPanels","window","innerHeight","kiosk","$scope","setupDashboardBindings","err","notifyApp","createErrorNotification","updateQueriesWhenComingFromExplore","setCurrent","dashboardWatcher","watch","leave","dashboardInitCompleted","data","isNew","folderId","panels","type","gridPos","x","y","w","h","parseInt","originPanelId","panelArrId","findIndex","panel","targets","clearDashboardQueriesToUpdateOnLoad","InfoMode","PanelHeaderCorner","getTimeSrv","getInfoMode","props","Error","description","Info","links","length","Links","getInfoContent","markdown","interpolatedMarkdown","getTemplateSrv","scopedVars","markedInterpolatedMarkdown","renderMarkdown","getLinks","replaceVariables","className","dangerouslySetInnerHTML","__html","map","link","idx","key","href","target","onClickError","getLocationSrv","update","inspect","inspectTab","infoMode","content","onClick","theme","toLowerCase","ariaLabel","selectors","components","Panels","Panel","headerCornerInfo","placement","aria-label","this","renderCornerType","Component","PanelHeaderNotice","notice","iconName","severity","text","e","name","style","marginRight","rel","PanelHeaderNotices","frames","useDispatch","openInspect","useCallback","tab","stopPropagation","notices","frame","Object","values","PanelHeaderMenuTrigger","children","divProps","useState","clickCoordinates","setClickCoordinates","panelMenuOpen","setPanelMenuOpen","onMenuToggle","event","current","clicked","eventToClickCoordinates","onMouseDown","closeMenu","Math","floor","clientX","clientY","PanelHeaderLoadingIndicator","state","styles","useStyles","getStyles","LoadingState","Loading","Streaming","streamIndicator","css","colors","textFaint","PanelHeaderMenuProvider","items","setItems","angularComponent","useSelector","useEffect","onInspectPanel","menu","isEditing","push","iconClassName","preventDefault","store","viewPanel","shortcut","canEditPanel","editPanel","sharePanel","contextSrv","hasAccessToExplore","plugin","skipDataQuery","openInNewWindow","ctrlKey","metaKey","open","config","appSubUrl","undefined","navigateToExplore","getDataSourceSrv","getExploreUrl","inspectMenu","canEdit","subMenu","isViewing","duplicatePanel","copyPanel","scope","getScope","panelCtrl","$$childHead","ctrl","angularMenuItems","getExtendedMenu","item","reactItem","click","$eval","removePanel","getPanelMenu","PanelHeaderMenu","renderItems","isSubMenu","role","menuItem","PanelHeaderMenuItem","PureComponent","PanelHeaderMenuWrapper","show","onClose","parent","document","PanelHeader","alertState","getDisplayTitle","cx","getQueryRunner","cancelQuery","getPanelLinksSupplier","series","libraryPanel","size","request","timeInfo","loadSnapshotData","getProcessedDataFrames","snapshotData","timeRange","getDefaultTimeRange","Done","applyFieldOverrides","fieldConfig","defaults","overrides","fieldConfigRegistry","timeZone","getTimezone","PanelChrome","subs","Subscription","onRefresh","isInView","width","timeData","applyPanelTimeOverrides","wantsQueryExecution","run","datasource","timezone","maxDataPoints","minInterval","interval","cacheTimeout","transformations","onRender","setState","refreshWhenInView","stateUpdate","renderCounter","onOptionsChange","options","updateOptions","onFieldConfigChange","updateFieldConfig","onPanelError","errorMessage","onChangeTimeRange","setTime","from","toUtc","to","isFirstLoad","NotStarted","add","events","subscribe","RefreshEvent","RenderEvent","panelInitialized","hasPanelSnapshot","getData","withTransforms","withFieldConfig","next","onDataUpdate","unsubscribe","prevProps","prevState","resendLastResult","snapshot","toDataFrameDTO","loadingState","pluginMeta","height","shouldSignalRenderingCompleted","profiler","renderingCompleted","PanelComponent","headerHeight","hasOverlayHeader","panelHeaderHeight","chromePadding","noPadding","panelPadding","panelWidth","PANEL_BORDER","innerPanelHeight","panelContentClassNames","classNames","panelOptions","getOptions","transparent","eventBus","hasTitle","containerClassNames","containerByTitle","renderPanel","PanelChromeAngularUnconnected","element","onPanelRenderEvent","payload","alert","forceUpdate","loadAngularPanel","queryRunner","onPanelDataUpdate","cleanUpAngularPanel","scopeProps","getInnerPanelHeight","getInnerPanelWidth","render","setPanelAngularComponent","loader","getAngularLoader","load","destroy","ref","mapDispatchToProps","PanelChromeAngular","connect","initDashboardPanel","DashboardPanel","panelState","connector","specialPanels","onMouseEnter","setPanelFocus","onMouseLeave","isLazy","angularPanelCtrl","panelWrapperClass"],"mappings":"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","file":"default~DashboardPage~SoloPanelPage.3817b8b78f33fc1605dc.js","sourcesContent":["export enum InspectTab {\n Data = 'data',\n Meta = 'meta', // When result metadata exists\n Error = 'error',\n Stats = 'stats',\n JSON = 'json',\n Query = 'query',\n}\n","import { DashboardModel } from './DashboardModel';\nimport { reportMetaAnalytics, MetaAnalyticsEventName, DashboardViewEventPayload } from '@grafana/runtime';\n\nexport function emitDashboardViewEvent(dashboard: DashboardModel) {\n const eventData: DashboardViewEventPayload = {\n dashboardId: dashboard.id,\n dashboardName: dashboard.title,\n dashboardUid: dashboard.uid,\n folderName: dashboard.meta.folderTitle,\n eventName: MetaAnalyticsEventName.DashboardView,\n };\n\n reportMetaAnalytics(eventData);\n}\n","// Services & Utils\nimport { createErrorNotification } from 'app/core/copy/appNotification';\nimport { backendSrv } from 'app/core/services/backend_srv';\nimport { DashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport { DashboardLoaderSrv } from 'app/features/dashboard/services/DashboardLoaderSrv';\nimport { TimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { AnnotationsSrv } from 'app/features/annotations/annotations_srv';\nimport { KeybindingSrv } from 'app/core/services/keybindingSrv';\n// Actions\nimport { notifyApp, updateLocation } from 'app/core/actions';\nimport {\n clearDashboardQueriesToUpdateOnLoad,\n dashboardInitCompleted,\n dashboardInitFailed,\n dashboardInitFetching,\n dashboardInitServices,\n dashboardInitSlow,\n} from './reducers';\n// Types\nimport {\n DashboardDTO,\n DashboardRouteInfo,\n StoreState,\n ThunkDispatch,\n ThunkResult,\n DashboardInitPhase,\n} from 'app/types';\nimport { DashboardModel } from './DashboardModel';\nimport { DataQuery, locationUtil } from '@grafana/data';\nimport { initVariablesTransaction } from '../../variables/state/actions';\nimport { emitDashboardViewEvent } from './analyticsProcessor';\nimport { dashboardWatcher } from 'app/features/live/dashboard/dashboardWatcher';\n\nexport interface InitDashboardArgs {\n $injector: any;\n $scope: any;\n urlUid?: string;\n urlSlug?: string;\n urlType?: string;\n urlFolderId?: string;\n routeInfo: DashboardRouteInfo;\n fixUrl: boolean;\n}\n\nasync function redirectToNewUrl(slug: string, dispatch: ThunkDispatch, currentPath: string) {\n const res = await backendSrv.getDashboardBySlug(slug);\n\n if (res) {\n let newUrl = res.meta.url;\n\n // fix solo route urls\n if (currentPath.indexOf('dashboard-solo') !== -1) {\n newUrl = newUrl.replace('/d/', '/d-solo/');\n }\n\n const url = locationUtil.stripBaseFromUrl(newUrl);\n dispatch(updateLocation({ path: url, partial: true, replace: true }));\n }\n}\n\nasync function fetchDashboard(\n args: InitDashboardArgs,\n dispatch: ThunkDispatch,\n getState: () => StoreState\n): Promise {\n try {\n switch (args.routeInfo) {\n case DashboardRouteInfo.Home: {\n // load home dash\n const dashDTO: DashboardDTO = await backendSrv.get('/api/dashboards/home');\n\n // if user specified a custom home dashboard redirect to that\n if (dashDTO.redirectUri) {\n const newUrl = locationUtil.stripBaseFromUrl(dashDTO.redirectUri);\n dispatch(updateLocation({ path: newUrl, replace: true }));\n return null;\n }\n\n // disable some actions on the default home dashboard\n dashDTO.meta.canSave = false;\n dashDTO.meta.canShare = false;\n dashDTO.meta.canStar = false;\n return dashDTO;\n }\n case DashboardRouteInfo.Normal: {\n // for old db routes we redirect\n if (args.urlType === 'db') {\n redirectToNewUrl(args.urlSlug!, dispatch, getState().location.path);\n return null;\n }\n\n const loaderSrv: DashboardLoaderSrv = args.$injector.get('dashboardLoaderSrv');\n const dashDTO: DashboardDTO = await loaderSrv.loadDashboard(args.urlType, args.urlSlug, args.urlUid);\n\n if (args.fixUrl && dashDTO.meta.url) {\n // check if the current url is correct (might be old slug)\n const dashboardUrl = locationUtil.stripBaseFromUrl(dashDTO.meta.url);\n const currentPath = getState().location.path;\n\n if (dashboardUrl !== currentPath) {\n // replace url to not create additional history items and then return so that initDashboard below isn't executed multiple times.\n dispatch(updateLocation({ path: dashboardUrl, partial: true, replace: true }));\n return null;\n }\n }\n return dashDTO;\n }\n case DashboardRouteInfo.New: {\n return getNewDashboardModelData(args.urlFolderId);\n }\n default:\n throw { message: 'Unknown route ' + args.routeInfo };\n }\n } catch (err) {\n // Ignore cancelled errors\n if (err.cancelled) {\n return null;\n }\n\n dispatch(dashboardInitFailed({ message: 'Failed to fetch dashboard', error: err }));\n console.error(err);\n return null;\n }\n}\n\n/**\n * This action (or saga) does everything needed to bootstrap a dashboard & dashboard model.\n * First it handles the process of fetching the dashboard, correcting the url if required (causing redirects/url updates)\n *\n * This is used both for single dashboard & solo panel routes, home & new dashboard routes.\n *\n * Then it handles the initializing of the old angular services that the dashboard components & panels still depend on\n *\n */\nexport function initDashboard(args: InitDashboardArgs): ThunkResult {\n return async (dispatch, getState) => {\n // set fetching state\n dispatch(dashboardInitFetching());\n\n // Detect slow loading / initializing and set state flag\n // This is in order to not show loading indication for fast loading dashboards as it creates blinking/flashing\n setTimeout(() => {\n if (getState().dashboard.getModel() === null) {\n dispatch(dashboardInitSlow());\n }\n }, 500);\n\n // fetch dashboard data\n const dashDTO = await fetchDashboard(args, dispatch, getState);\n\n // returns null if there was a redirect or error\n if (!dashDTO) {\n return;\n }\n\n // set initializing state\n dispatch(dashboardInitServices());\n\n // create model\n let dashboard: DashboardModel;\n try {\n dashboard = new DashboardModel(dashDTO.dashboard, dashDTO.meta);\n } catch (err) {\n dispatch(dashboardInitFailed({ message: 'Failed create dashboard model', error: err }));\n console.error(err);\n return;\n }\n\n // add missing orgId query param\n const storeState = getState();\n if (!storeState.location.query.orgId) {\n dispatch(updateLocation({ query: { orgId: storeState.user.orgId }, partial: true, replace: true }));\n }\n\n // init services\n const timeSrv: TimeSrv = args.$injector.get('timeSrv');\n const annotationsSrv: AnnotationsSrv = args.$injector.get('annotationsSrv');\n const keybindingSrv: KeybindingSrv = args.$injector.get('keybindingSrv');\n const unsavedChangesSrv = args.$injector.get('unsavedChangesSrv');\n const dashboardSrv: DashboardSrv = args.$injector.get('dashboardSrv');\n\n timeSrv.init(dashboard);\n annotationsSrv.init(dashboard);\n\n if (storeState.dashboard.modifiedQueries) {\n const { panelId, queries } = storeState.dashboard.modifiedQueries;\n dashboard.meta.fromExplore = !!(panelId && queries);\n }\n\n // template values service needs to initialize completely before the rest of the dashboard can load\n await dispatch(initVariablesTransaction(args.urlUid!, dashboard));\n\n if (getState().templating.transaction.uid !== args.urlUid) {\n // if a previous dashboard has slow running variable queries the batch uid will be the new one\n // but the args.urlUid will be the same as before initVariablesTransaction was called so then we can't continue initializing\n // the previous dashboard.\n return;\n }\n\n // If dashboard is in a different init phase it means it cancelled during service init\n if (getState().dashboard.initPhase !== DashboardInitPhase.Services) {\n return;\n }\n\n try {\n dashboard.processRepeats();\n dashboard.updateSubmenuVisibility();\n\n // handle auto fix experimental feature\n const queryParams = getState().location.query;\n if (queryParams.autofitpanels) {\n dashboard.autoFitPanels(window.innerHeight, queryParams.kiosk);\n }\n\n // init unsaved changes tracking\n unsavedChangesSrv.init(dashboard, args.$scope);\n keybindingSrv.setupDashboardBindings(args.$scope, dashboard);\n } catch (err) {\n dispatch(notifyApp(createErrorNotification('Dashboard init failed', err)));\n console.error(err);\n }\n\n if (storeState.dashboard.modifiedQueries) {\n const { panelId, queries } = storeState.dashboard.modifiedQueries;\n updateQueriesWhenComingFromExplore(dispatch, dashboard, panelId, queries);\n }\n\n // legacy srv state\n dashboardSrv.setCurrent(dashboard);\n\n // send open dashboard event\n if (args.routeInfo !== DashboardRouteInfo.New) {\n emitDashboardViewEvent(dashboard);\n\n // Listen for changes on the current dashboard\n dashboardWatcher.watch(dashboard.uid);\n } else {\n dashboardWatcher.leave();\n }\n\n // yay we are done\n dispatch(dashboardInitCompleted(dashboard));\n };\n}\n\nfunction getNewDashboardModelData(urlFolderId?: string): any {\n const data = {\n meta: {\n canStar: false,\n canShare: false,\n isNew: true,\n folderId: 0,\n },\n dashboard: {\n title: 'New dashboard',\n panels: [\n {\n type: 'add-panel',\n gridPos: { x: 0, y: 0, w: 12, h: 9 },\n title: 'Panel Title',\n },\n ],\n },\n };\n\n if (urlFolderId) {\n data.meta.folderId = parseInt(urlFolderId, 10);\n }\n\n return data;\n}\n\nfunction updateQueriesWhenComingFromExplore(\n dispatch: ThunkDispatch,\n dashboard: DashboardModel,\n originPanelId: number,\n queries: DataQuery[]\n) {\n const panelArrId = dashboard.panels.findIndex((panel) => panel.id === originPanelId);\n\n if (panelArrId > -1) {\n dashboard.panels[panelArrId].targets = queries;\n }\n\n // Clear update state now that we're done\n dispatch(clearDashboardQueriesToUpdateOnLoad());\n}\n","import React, { Component } from 'react';\n\nimport { renderMarkdown, LinkModelSupplier, ScopedVars } from '@grafana/data';\nimport { Tooltip, PopoverContent } from '@grafana/ui';\nimport { getLocationSrv, getTemplateSrv } from '@grafana/runtime';\n\nimport { PanelModel } from 'app/features/dashboard/state/PanelModel';\nimport { getTimeSrv, TimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { InspectTab } from 'app/features/inspector/types';\nimport { selectors } from '@grafana/e2e-selectors';\n\nenum InfoMode {\n Error = 'Error',\n Info = 'Info',\n Links = 'Links',\n}\n\ninterface Props {\n panel: PanelModel;\n title?: string;\n description?: string;\n scopedVars?: ScopedVars;\n links?: LinkModelSupplier;\n error?: string;\n}\n\nexport class PanelHeaderCorner extends Component {\n timeSrv: TimeSrv = getTimeSrv();\n\n getInfoMode = () => {\n const { panel, error } = this.props;\n if (error) {\n return InfoMode.Error;\n }\n if (!!panel.description) {\n return InfoMode.Info;\n }\n if (panel.links && panel.links.length) {\n return InfoMode.Links;\n }\n\n return undefined;\n };\n\n getInfoContent = (): JSX.Element => {\n const { panel } = this.props;\n const markdown = panel.description || '';\n const interpolatedMarkdown = getTemplateSrv().replace(markdown, panel.scopedVars);\n const markedInterpolatedMarkdown = renderMarkdown(interpolatedMarkdown);\n const links = this.props.links && this.props.links.getLinks(panel.replaceVariables);\n\n return (\n
\n
\n\n {links && links.length > 0 && (\n \n )}\n
\n );\n };\n\n /**\n * Open the Panel Inspector when we click on an error\n */\n onClickError = () => {\n getLocationSrv().update({ partial: true, query: { inspect: this.props.panel.id, inspectTab: InspectTab.Error } });\n };\n\n renderCornerType(infoMode: InfoMode, content: PopoverContent, onClick?: () => void) {\n const theme = infoMode === InfoMode.Error ? 'error' : 'info';\n const className = `panel-info-corner panel-info-corner--${infoMode.toLowerCase()}`;\n const ariaLabel = selectors.components.Panels.Panel.headerCornerInfo(infoMode.toLowerCase());\n\n return (\n \n
\n \n \n
\n
\n );\n }\n\n render() {\n const { error } = this.props;\n const infoMode: InfoMode | undefined = this.getInfoMode();\n\n if (!infoMode) {\n return null;\n }\n\n if (infoMode === InfoMode.Error && error) {\n return this.renderCornerType(infoMode, error, this.onClickError);\n }\n\n if (infoMode === InfoMode.Info || infoMode === InfoMode.Links) {\n return this.renderCornerType(infoMode, this.getInfoContent);\n }\n\n return null;\n }\n}\n\nexport default PanelHeaderCorner;\n","import React, { FC } from 'react';\nimport { QueryResultMetaNotice } from '@grafana/data';\nimport { Icon, Tooltip } from '@grafana/ui';\n\ninterface Props {\n notice: QueryResultMetaNotice;\n onClick: (e: React.SyntheticEvent, tab: string) => void;\n}\n\nexport const PanelHeaderNotice: FC = ({ notice, onClick }) => {\n const iconName =\n notice.severity === 'error' || notice.severity === 'warning' ? 'exclamation-triangle' : 'info-circle';\n\n return (\n \n {notice.inspect ? (\n
onClick(e, notice.inspect!)}>\n \n
\n ) : (\n \n \n \n )}\n
\n );\n};\n","import React, { FC, useCallback } from 'react';\nimport { DataFrame, QueryResultMetaNotice } from '@grafana/data';\nimport { PanelHeaderNotice } from './PanelHeaderNotice';\nimport { useDispatch } from 'react-redux';\nimport { updateLocation } from '../../../../core/actions';\n\ninterface Props {\n panelId: number;\n frames: DataFrame[];\n}\n\nexport const PanelHeaderNotices: FC = ({ frames, panelId }) => {\n const dispatch = useDispatch();\n const openInspect = useCallback(\n (e: React.SyntheticEvent, tab: string) => {\n e.stopPropagation();\n\n dispatch(\n updateLocation({\n query: { inspect: panelId, inspectTab: tab },\n partial: true,\n })\n );\n },\n [panelId]\n );\n\n // dedupe on severity\n const notices: Record = {};\n for (const frame of frames) {\n if (!frame.meta || !frame.meta.notices) {\n continue;\n }\n\n for (const notice of frame.meta.notices) {\n notices[notice.severity] = notice;\n }\n }\n\n return (\n <>\n {Object.values(notices).map((notice) => (\n \n ))}\n \n );\n};\n","import React, { FC, HTMLAttributes, MouseEvent, ReactElement, useCallback, useState } from 'react';\nimport { CartesianCoords2D } from '@grafana/data';\n\ninterface PanelHeaderMenuTriggerApi {\n panelMenuOpen: boolean;\n closeMenu: () => void;\n}\n\ninterface Props extends HTMLAttributes {\n children: (props: PanelHeaderMenuTriggerApi) => ReactElement;\n}\n\nexport const PanelHeaderMenuTrigger: FC = ({ children, ...divProps }) => {\n const [clickCoordinates, setClickCoordinates] = useState({ x: 0, y: 0 });\n const [panelMenuOpen, setPanelMenuOpen] = useState(false);\n const onMenuToggle = useCallback(\n (event: MouseEvent) => {\n if (!isClick(clickCoordinates, eventToClickCoordinates(event))) {\n return;\n }\n\n event.stopPropagation();\n\n setPanelMenuOpen(!panelMenuOpen);\n },\n [clickCoordinates, panelMenuOpen, setPanelMenuOpen]\n );\n const onMouseDown = useCallback(\n (event: MouseEvent) => {\n setClickCoordinates(eventToClickCoordinates(event));\n },\n [setClickCoordinates]\n );\n\n return (\n
\n {children({ panelMenuOpen, closeMenu: () => setPanelMenuOpen(false) })}\n
\n );\n};\n\nfunction isClick(current: CartesianCoords2D, clicked: CartesianCoords2D): boolean {\n return clicked.x === current.x && clicked.y === current.y;\n}\n\nfunction eventToClickCoordinates(event: MouseEvent): CartesianCoords2D {\n return {\n x: Math.floor(event.clientX),\n y: Math.floor(event.clientY),\n };\n}\n","import React, { FC } from 'react';\nimport { css } from 'emotion';\nimport { GrafanaTheme, LoadingState } from '@grafana/data';\nimport { Icon, Tooltip, useStyles } from '@grafana/ui';\n\ninterface Props {\n state: LoadingState;\n onClick: () => void;\n}\n\nexport const PanelHeaderLoadingIndicator: FC = ({ state, onClick }) => {\n const styles = useStyles(getStyles);\n\n if (state === LoadingState.Loading) {\n return (\n
\n \n \n \n
\n );\n }\n\n if (state === LoadingState.Streaming) {\n return (\n
\n
\n
\n );\n }\n\n return null;\n};\n\nfunction getStyles(theme: GrafanaTheme) {\n return {\n streamIndicator: css`\n width: 10px;\n height: 10px;\n background: ${theme.colors.textFaint};\n box-shadow: 0 0 2px ${theme.colors.textFaint};\n border-radius: 50%;\n position: relative;\n top: 6px;\n right: 1px;\n `,\n };\n}\n","import { FC, ReactElement, useEffect, useState } from 'react';\nimport { useSelector } from 'react-redux';\nimport { PanelMenuItem } from '@grafana/data';\n\nimport { DashboardModel, PanelModel } from '../../state';\nimport { StoreState } from '../../../../types';\nimport { getPanelMenu } from '../../utils/getPanelMenu';\n\ninterface PanelHeaderMenuProviderApi {\n items: PanelMenuItem[];\n}\n\ninterface Props {\n panel: PanelModel;\n dashboard: DashboardModel;\n children: (props: PanelHeaderMenuProviderApi) => ReactElement;\n}\n\nexport const PanelHeaderMenuProvider: FC = ({ panel, dashboard, children }) => {\n const [items, setItems] = useState([]);\n const angularComponent = useSelector(\n (state: StoreState) => state.dashboard.panels[panel.id]?.angularComponent || null\n );\n useEffect(() => {\n setItems(getPanelMenu(dashboard, panel, angularComponent));\n }, [dashboard, panel, angularComponent, setItems]);\n\n return children({ items });\n};\n","import { updateLocation } from 'app/core/actions';\nimport { store } from 'app/store/store';\nimport { AngularComponent, getDataSourceSrv, getLocationSrv } from '@grafana/runtime';\nimport { PanelMenuItem } from '@grafana/data';\nimport { copyPanel, duplicatePanel, removePanel, sharePanel } from 'app/features/dashboard/utils/panel';\nimport { PanelModel } from 'app/features/dashboard/state/PanelModel';\nimport { DashboardModel } from 'app/features/dashboard/state/DashboardModel';\nimport { contextSrv } from '../../../core/services/context_srv';\nimport { navigateToExplore } from '../../explore/state/main';\nimport { getExploreUrl } from '../../../core/utils/explore';\nimport { getTimeSrv } from '../services/TimeSrv';\nimport { PanelCtrl } from '../../panel/panel_ctrl';\nimport config from 'app/core/config';\n\nexport function getPanelMenu(\n dashboard: DashboardModel,\n panel: PanelModel,\n angularComponent?: AngularComponent | null\n): PanelMenuItem[] {\n const onViewPanel = (event: React.MouseEvent) => {\n event.preventDefault();\n store.dispatch(\n updateLocation({\n query: {\n viewPanel: panel.id,\n },\n partial: true,\n })\n );\n };\n\n const onEditPanel = (event: React.MouseEvent) => {\n event.preventDefault();\n store.dispatch(\n updateLocation({\n query: {\n editPanel: panel.id,\n },\n partial: true,\n })\n );\n };\n\n const onSharePanel = (event: React.MouseEvent) => {\n event.preventDefault();\n sharePanel(dashboard, panel);\n };\n\n const onInspectPanel = (tab?: string) => {\n getLocationSrv().update({\n partial: true,\n query: {\n inspect: panel.id,\n inspectTab: tab,\n },\n });\n };\n\n const onMore = (event: React.MouseEvent) => {\n event.preventDefault();\n };\n\n const onDuplicatePanel = (event: React.MouseEvent) => {\n event.preventDefault();\n duplicatePanel(dashboard, panel);\n };\n\n const onCopyPanel = (event: React.MouseEvent) => {\n event.preventDefault();\n copyPanel(panel);\n };\n\n const onRemovePanel = (event: React.MouseEvent) => {\n event.preventDefault();\n removePanel(dashboard, panel, true);\n };\n\n const onNavigateToExplore = (event: React.MouseEvent) => {\n event.preventDefault();\n const openInNewWindow =\n event.ctrlKey || event.metaKey ? (url: string) => window.open(`${config.appSubUrl}${url}`) : undefined;\n store.dispatch(navigateToExplore(panel, { getDataSourceSrv, getTimeSrv, getExploreUrl, openInNewWindow }) as any);\n };\n\n const menu: PanelMenuItem[] = [];\n\n if (!panel.isEditing) {\n menu.push({\n text: 'View',\n iconClassName: 'eye',\n onClick: onViewPanel,\n shortcut: 'v',\n });\n }\n\n if (dashboard.canEditPanel(panel) && !panel.isEditing) {\n menu.push({\n text: 'Edit',\n iconClassName: 'edit',\n onClick: onEditPanel,\n shortcut: 'e',\n });\n }\n\n menu.push({\n text: 'Share',\n iconClassName: 'share-alt',\n onClick: onSharePanel,\n shortcut: 'p s',\n });\n\n if (contextSrv.hasAccessToExplore() && !(panel.plugin && panel.plugin.meta.skipDataQuery)) {\n menu.push({\n text: 'Explore',\n iconClassName: 'compass',\n shortcut: 'x',\n onClick: onNavigateToExplore,\n });\n }\n\n const inspectMenu: PanelMenuItem[] = [];\n\n // Only show these inspect actions for data plugins\n if (panel.plugin && !panel.plugin.meta.skipDataQuery) {\n inspectMenu.push({\n text: 'Data',\n onClick: (e: React.MouseEvent) => onInspectPanel('data'),\n });\n\n if (dashboard.meta.canEdit) {\n inspectMenu.push({\n text: 'Query',\n onClick: (e: React.MouseEvent) => onInspectPanel('query'),\n });\n }\n }\n\n inspectMenu.push({\n text: 'Panel JSON',\n onClick: (e: React.MouseEvent) => onInspectPanel('json'),\n });\n\n menu.push({\n type: 'submenu',\n text: 'Inspect',\n iconClassName: 'info-circle',\n onClick: (e: React.MouseEvent) => onInspectPanel(),\n shortcut: 'i',\n subMenu: inspectMenu,\n });\n\n const subMenu: PanelMenuItem[] = [];\n\n if (dashboard.canEditPanel(panel) && !(panel.isViewing || panel.isEditing)) {\n subMenu.push({\n text: 'Duplicate',\n onClick: onDuplicatePanel,\n shortcut: 'p d',\n });\n\n subMenu.push({\n text: 'Copy',\n onClick: onCopyPanel,\n });\n }\n\n // add old angular panel options\n if (angularComponent) {\n const scope = angularComponent.getScope();\n const panelCtrl: PanelCtrl = scope.$$childHead.ctrl;\n const angularMenuItems = panelCtrl.getExtendedMenu();\n\n for (const item of angularMenuItems) {\n const reactItem: PanelMenuItem = {\n text: item.text,\n href: item.href,\n shortcut: item.shortcut,\n };\n\n if (item.click) {\n reactItem.onClick = () => {\n scope.$eval(item.click, { ctrl: panelCtrl });\n };\n }\n\n subMenu.push(reactItem);\n }\n }\n\n if (!panel.isEditing && subMenu.length) {\n menu.push({\n type: 'submenu',\n text: 'More...',\n iconClassName: 'cube',\n subMenu,\n onClick: onMore,\n });\n }\n\n if (dashboard.canEditPanel(panel) && !panel.isEditing && !panel.isViewing) {\n menu.push({ type: 'divider', text: '' });\n\n menu.push({\n text: 'Remove',\n iconClassName: 'trash-alt',\n onClick: onRemovePanel,\n shortcut: 'p r',\n });\n }\n\n return menu;\n}\n","import React, { PureComponent } from 'react';\nimport { PanelHeaderMenuItem } from './PanelHeaderMenuItem';\nimport { PanelMenuItem } from '@grafana/data';\n\nexport interface Props {\n items: PanelMenuItem[];\n}\n\nexport class PanelHeaderMenu extends PureComponent {\n renderItems = (menu: PanelMenuItem[], isSubMenu = false) => {\n return (\n
    \n {menu.map((menuItem, idx: number) => {\n return (\n \n {menuItem.subMenu && this.renderItems(menuItem.subMenu, true)}\n \n );\n })}\n
\n );\n };\n\n render() {\n return
{this.renderItems(this.props.items)}
;\n }\n}\n","import React, { FC } from 'react';\nimport { ClickOutsideWrapper } from '@grafana/ui';\nimport { PanelHeaderMenuProvider } from './PanelHeaderMenuProvider';\nimport { PanelHeaderMenu } from './PanelHeaderMenu';\nimport { DashboardModel, PanelModel } from '../../state';\n\ninterface Props {\n panel: PanelModel;\n dashboard: DashboardModel;\n show: boolean;\n onClose: () => void;\n}\n\nexport const PanelHeaderMenuWrapper: FC = ({ show, onClose, panel, dashboard }) => {\n if (!show) {\n return null;\n }\n\n return (\n \n \n {({ items }) => {\n return ;\n }}\n \n \n );\n};\n","import React, { FC } from 'react';\nimport { cx } from 'emotion';\nimport { DataLink, PanelData } from '@grafana/data';\nimport { Icon } from '@grafana/ui';\nimport { selectors } from '@grafana/e2e-selectors';\n\nimport PanelHeaderCorner from './PanelHeaderCorner';\nimport { DashboardModel } from 'app/features/dashboard/state/DashboardModel';\nimport { PanelModel } from 'app/features/dashboard/state/PanelModel';\nimport { getPanelLinksSupplier } from 'app/features/panel/panellinks/linkSuppliers';\nimport { PanelHeaderNotices } from './PanelHeaderNotices';\nimport { PanelHeaderMenuTrigger } from './PanelHeaderMenuTrigger';\nimport { PanelHeaderLoadingIndicator } from './PanelHeaderLoadingIndicator';\nimport { PanelHeaderMenuWrapper } from './PanelHeaderMenuWrapper';\n\nexport interface Props {\n panel: PanelModel;\n dashboard: DashboardModel;\n title?: string;\n description?: string;\n links?: DataLink[];\n error?: string;\n alertState?: string;\n isViewing: boolean;\n isEditing: boolean;\n data: PanelData;\n}\n\nexport const PanelHeader: FC = ({ panel, error, isViewing, isEditing, data, alertState, dashboard }) => {\n const onCancelQuery = () => panel.getQueryRunner().cancelQuery();\n const title = panel.getDisplayTitle();\n const className = cx('panel-header', !(isViewing || isEditing) ? 'grid-drag-handle' : '');\n\n return (\n <>\n \n
\n \n \n {({ closeMenu, panelMenuOpen }) => {\n return (\n
\n \n {panel.libraryPanel && }\n {alertState ? (\n \n ) : null}\n {title}\n \n \n {data.request && data.request.timeInfo && (\n \n {data.request.timeInfo}\n \n )}\n
\n );\n }}\n
\n
\n \n );\n};\n","import { applyFieldOverrides, getDefaultTimeRange, LoadingState, PanelData } from '@grafana/data';\nimport { config } from 'app/core/config';\nimport { DashboardModel, PanelModel } from '../state';\nimport { getProcessedDataFrames } from '../../query/state/runRequest';\n\nexport function loadSnapshotData(panel: PanelModel, dashboard: DashboardModel): PanelData {\n const data = getProcessedDataFrames(panel.snapshotData);\n\n return {\n timeRange: getDefaultTimeRange(),\n state: LoadingState.Done,\n series: applyFieldOverrides({\n data,\n fieldConfig: {\n defaults: {},\n overrides: [],\n },\n replaceVariables: panel.replaceVariables,\n fieldConfigRegistry: panel.plugin!.fieldConfigRegistry,\n theme: config.theme,\n timeZone: dashboard.getTimezone(),\n }),\n };\n}\n","// Libraries\nimport React, { Component } from 'react';\nimport classNames from 'classnames';\nimport { Subscription } from 'rxjs';\n// Components\nimport { PanelHeader } from './PanelHeader/PanelHeader';\nimport { ErrorBoundary } from '@grafana/ui';\n// Utils & Services\nimport { getTimeSrv, TimeSrv } from '../services/TimeSrv';\nimport { applyPanelTimeOverrides } from 'app/features/dashboard/utils/panel';\nimport { profiler } from 'app/core/profiler';\nimport config from 'app/core/config';\n// Types\nimport { DashboardModel, PanelModel } from '../state';\nimport { PANEL_BORDER } from 'app/core/constants';\nimport {\n AbsoluteTimeRange,\n FieldConfigSource,\n getDefaultTimeRange,\n LoadingState,\n PanelData,\n PanelPlugin,\n PanelPluginMeta,\n toDataFrameDTO,\n toUtc,\n} from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { loadSnapshotData } from '../utils/loadSnapshotData';\nimport { RefreshEvent, RenderEvent } from 'app/types/events';\n\nconst DEFAULT_PLUGIN_ERROR = 'Error in plugin';\n\nexport interface Props {\n panel: PanelModel;\n dashboard: DashboardModel;\n plugin: PanelPlugin;\n isViewing: boolean;\n isEditing: boolean;\n isInView: boolean;\n width: number;\n height: number;\n}\n\nexport interface State {\n isFirstLoad: boolean;\n renderCounter: number;\n errorMessage?: string;\n refreshWhenInView: boolean;\n data: PanelData;\n}\n\nexport class PanelChrome extends Component {\n private readonly timeSrv: TimeSrv = getTimeSrv();\n private subs = new Subscription();\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n isFirstLoad: true,\n renderCounter: 0,\n refreshWhenInView: false,\n data: {\n state: LoadingState.NotStarted,\n series: [],\n timeRange: getDefaultTimeRange(),\n },\n };\n }\n\n componentDidMount() {\n const { panel, dashboard } = this.props;\n\n // Subscribe to panel events\n this.subs.add(panel.events.subscribe(RefreshEvent, this.onRefresh));\n this.subs.add(panel.events.subscribe(RenderEvent, this.onRender));\n\n dashboard.panelInitialized(this.props.panel);\n\n // Move snapshot data into the query response\n if (this.hasPanelSnapshot) {\n this.setState({\n data: loadSnapshotData(panel, dashboard),\n isFirstLoad: false,\n });\n return;\n }\n\n if (!this.wantsQueryExecution) {\n this.setState({ isFirstLoad: false });\n }\n\n this.subs.add(\n panel\n .getQueryRunner()\n .getData({ withTransforms: true, withFieldConfig: true })\n .subscribe({\n next: (data) => this.onDataUpdate(data),\n })\n );\n }\n\n componentWillUnmount() {\n this.subs.unsubscribe();\n }\n\n componentDidUpdate(prevProps: Props) {\n const { isInView } = this.props;\n\n // View state has changed\n if (isInView !== prevProps.isInView) {\n if (isInView) {\n // Check if we need a delayed refresh\n if (this.state.refreshWhenInView) {\n this.onRefresh();\n }\n }\n }\n }\n\n shouldComponentUpdate(prevProps: Props, prevState: State) {\n const { plugin, panel } = this.props;\n\n // If plugin changed we need to process fieldOverrides again\n // We do this by asking panel query runner to resend last result\n if (prevProps.plugin !== plugin) {\n panel.getQueryRunner().resendLastResult();\n return false;\n }\n\n return true;\n }\n\n // Updates the response with information from the stream\n // The next is outside a react synthetic event so setState is not batched\n // So in this context we can only do a single call to setState\n onDataUpdate(data: PanelData) {\n if (!this.props.isInView) {\n if (data.state !== LoadingState.Streaming) {\n // Ignore events when not visible.\n // The call will be repeated when the panel comes into view\n this.setState({ refreshWhenInView: true });\n }\n\n return;\n }\n\n let { isFirstLoad } = this.state;\n let errorMessage: string | undefined;\n\n switch (data.state) {\n case LoadingState.Loading:\n // Skip updating state data if it is already in loading state\n // This is to avoid rendering partial loading responses\n if (this.state.data.state === LoadingState.Loading) {\n return;\n }\n break;\n case LoadingState.Error:\n const { error } = data;\n if (error) {\n if (errorMessage !== error.message) {\n errorMessage = error.message;\n }\n }\n break;\n case LoadingState.Done:\n // If we are doing a snapshot save data in panel model\n if (this.props.dashboard.snapshot) {\n this.props.panel.snapshotData = data.series.map((frame) => toDataFrameDTO(frame));\n }\n if (isFirstLoad) {\n isFirstLoad = false;\n }\n break;\n }\n\n this.setState({ isFirstLoad, errorMessage, data });\n }\n\n onRefresh = () => {\n const { panel, isInView, width } = this.props;\n if (!isInView) {\n this.setState({ refreshWhenInView: true });\n return;\n }\n\n const timeData = applyPanelTimeOverrides(panel, this.timeSrv.timeRange());\n\n // Issue Query\n if (this.wantsQueryExecution) {\n if (width < 0) {\n return;\n }\n\n panel.getQueryRunner().run({\n datasource: panel.datasource,\n queries: panel.targets,\n panelId: panel.id,\n dashboardId: this.props.dashboard.id,\n timezone: this.props.dashboard.getTimezone(),\n timeRange: timeData.timeRange,\n timeInfo: timeData.timeInfo,\n maxDataPoints: panel.maxDataPoints || width,\n minInterval: panel.interval,\n scopedVars: panel.scopedVars,\n cacheTimeout: panel.cacheTimeout,\n transformations: panel.transformations,\n });\n } else {\n // The panel should render on refresh as well if it doesn't have a query, like clock panel\n this.onRender();\n }\n };\n\n onRender = () => {\n const stateUpdate = { renderCounter: this.state.renderCounter + 1 };\n this.setState(stateUpdate);\n };\n\n onOptionsChange = (options: any) => {\n this.props.panel.updateOptions(options);\n };\n\n onFieldConfigChange = (config: FieldConfigSource) => {\n this.props.panel.updateFieldConfig(config);\n };\n\n onPanelError = (message: string) => {\n if (this.state.errorMessage !== message) {\n this.setState({ errorMessage: message });\n }\n };\n\n get hasPanelSnapshot() {\n const { panel } = this.props;\n return panel.snapshotData && panel.snapshotData.length;\n }\n\n get wantsQueryExecution() {\n return !(this.props.plugin.meta.skipDataQuery || this.hasPanelSnapshot);\n }\n\n onChangeTimeRange = (timeRange: AbsoluteTimeRange) => {\n this.timeSrv.setTime({\n from: toUtc(timeRange.from),\n to: toUtc(timeRange.to),\n });\n };\n\n shouldSignalRenderingCompleted(loadingState: LoadingState, pluginMeta: PanelPluginMeta) {\n return loadingState === LoadingState.Done || pluginMeta.skipDataQuery;\n }\n\n renderPanel(width: number, height: number) {\n const { panel, plugin, dashboard } = this.props;\n const { renderCounter, data, isFirstLoad } = this.state;\n const { theme } = config;\n const { state: loadingState } = data;\n\n // do not render component until we have first data\n if (isFirstLoad && (loadingState === LoadingState.Loading || loadingState === LoadingState.NotStarted)) {\n return null;\n }\n\n // This is only done to increase a counter that is used by backend\n // image rendering to know when to capture image\n if (this.shouldSignalRenderingCompleted(loadingState, plugin.meta)) {\n profiler.renderingCompleted();\n }\n\n const PanelComponent = plugin.panel!;\n const timeRange = data.timeRange || this.timeSrv.timeRange();\n const headerHeight = this.hasOverlayHeader() ? 0 : theme.panelHeaderHeight;\n const chromePadding = plugin.noPadding ? 0 : theme.panelPadding;\n const panelWidth = width - chromePadding * 2 - PANEL_BORDER;\n const innerPanelHeight = height - headerHeight - chromePadding * 2 - PANEL_BORDER;\n const panelContentClassNames = classNames({\n 'panel-content': true,\n 'panel-content--no-padding': plugin.noPadding,\n });\n const panelOptions = panel.getOptions();\n\n return (\n <>\n
\n \n
\n \n );\n }\n\n hasOverlayHeader() {\n const { panel } = this.props;\n const { errorMessage, data } = this.state;\n\n // always show normal header if we have an error message\n if (errorMessage) {\n return false;\n }\n\n // always show normal header if we have time override\n if (data.request && data.request.timeInfo) {\n return false;\n }\n\n return !panel.hasTitle();\n }\n\n render() {\n const { dashboard, panel, isViewing, isEditing, width, height } = this.props;\n const { errorMessage, data } = this.state;\n const { transparent } = panel;\n\n const containerClassNames = classNames({\n 'panel-container': true,\n 'panel-container--absolute': true,\n 'panel-container--transparent': transparent,\n 'panel-container--no-title': this.hasOverlayHeader(),\n });\n\n return (\n
\n \n \n {({ error }) => {\n if (error) {\n this.onPanelError(error.message || DEFAULT_PLUGIN_ERROR);\n return null;\n }\n return this.renderPanel(width, height);\n }}\n \n
\n );\n }\n}\n","// Libraries\nimport React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport { Subscription } from 'rxjs';\nimport { connect, MapDispatchToProps, MapStateToProps } from 'react-redux';\n// Components\nimport { PanelHeader } from './PanelHeader/PanelHeader';\n// Utils & Services\nimport { getTimeSrv, TimeSrv } from '../services/TimeSrv';\nimport { AngularComponent, getAngularLoader } from '@grafana/runtime';\nimport { setPanelAngularComponent } from '../state/reducers';\nimport config from 'app/core/config';\n// Types\nimport { DashboardModel, PanelModel } from '../state';\nimport { StoreState } from 'app/types';\nimport { getDefaultTimeRange, LoadingState, PanelData, PanelPlugin } from '@grafana/data';\nimport { PANEL_BORDER } from 'app/core/constants';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { RenderEvent } from 'app/types/events';\n\ninterface OwnProps {\n panel: PanelModel;\n dashboard: DashboardModel;\n plugin: PanelPlugin;\n isViewing: boolean;\n isEditing: boolean;\n isInView: boolean;\n width: number;\n height: number;\n}\n\ninterface ConnectedProps {\n angularComponent?: AngularComponent | null;\n}\n\ninterface DispatchProps {\n setPanelAngularComponent: typeof setPanelAngularComponent;\n}\n\nexport type Props = OwnProps & ConnectedProps & DispatchProps;\n\nexport interface State {\n data: PanelData;\n errorMessage?: string;\n alertState?: string;\n}\n\ninterface AngularScopeProps {\n panel: PanelModel;\n dashboard: DashboardModel;\n size: {\n height: number;\n width: number;\n };\n}\n\nexport class PanelChromeAngularUnconnected extends PureComponent {\n element: HTMLElement | null = null;\n timeSrv: TimeSrv = getTimeSrv();\n scopeProps?: AngularScopeProps;\n subs = new Subscription();\n\n constructor(props: Props) {\n super(props);\n this.state = {\n data: {\n state: LoadingState.NotStarted,\n series: [],\n timeRange: getDefaultTimeRange(),\n },\n };\n }\n\n componentDidMount() {\n const { panel } = this.props;\n this.loadAngularPanel();\n\n // subscribe to data events\n const queryRunner = panel.getQueryRunner();\n\n // we are not displaying any of this data so no need for transforms or field config\n this.subs.add(\n queryRunner.getData({ withTransforms: false, withFieldConfig: false }).subscribe({\n next: (data: PanelData) => this.onPanelDataUpdate(data),\n })\n );\n\n this.subs.add(panel.events.subscribe(RenderEvent, this.onPanelRenderEvent));\n }\n\n onPanelRenderEvent = (event: RenderEvent) => {\n const { alertState } = this.state;\n // graph sends these old render events with payloads\n const payload = event.payload;\n\n if (payload && payload.alertState && this.props.panel.alert) {\n this.setState({ alertState: payload.alertState });\n } else if (payload && payload.alertState && !this.props.panel.alert) {\n // when user deletes alert in panel editor the source panel needs to refresh as this is in the mutable state and\n // will not automatically re render\n this.setState({ alertState: undefined });\n } else if (payload && alertState) {\n this.setState({ alertState: undefined });\n } else {\n // only needed for detecting title updates right now fix before 7.0\n this.forceUpdate();\n }\n };\n\n onPanelDataUpdate(data: PanelData) {\n let errorMessage: string | undefined;\n\n if (data.state === LoadingState.Error) {\n const { error } = data;\n if (error) {\n if (errorMessage !== error.message) {\n errorMessage = error.message;\n }\n }\n }\n\n this.setState({ data, errorMessage });\n }\n\n componentWillUnmount() {\n this.cleanUpAngularPanel();\n this.subs.unsubscribe();\n }\n\n componentDidUpdate(prevProps: Props, prevState: State) {\n const { plugin, height, width, panel } = this.props;\n\n if (prevProps.plugin !== plugin) {\n this.cleanUpAngularPanel();\n this.loadAngularPanel();\n }\n\n if (prevProps.width !== width || prevProps.height !== height) {\n if (this.scopeProps) {\n this.scopeProps.size.height = this.getInnerPanelHeight();\n this.scopeProps.size.width = this.getInnerPanelWidth();\n panel.render();\n }\n }\n }\n\n getInnerPanelHeight() {\n const { plugin, height } = this.props;\n const { theme } = config;\n\n const headerHeight = this.hasOverlayHeader() ? 0 : theme.panelHeaderHeight;\n const chromePadding = plugin.noPadding ? 0 : theme.panelPadding;\n return height - headerHeight - chromePadding * 2 - PANEL_BORDER;\n }\n\n getInnerPanelWidth() {\n const { plugin, width } = this.props;\n const { theme } = config;\n\n const chromePadding = plugin.noPadding ? 0 : theme.panelPadding;\n return width - chromePadding * 2 - PANEL_BORDER;\n }\n\n loadAngularPanel() {\n const { panel, dashboard, setPanelAngularComponent } = this.props;\n\n // if we have no element or already have loaded the panel return\n if (!this.element) {\n return;\n }\n\n const loader = getAngularLoader();\n const template = '';\n\n this.scopeProps = {\n panel: panel,\n dashboard: dashboard,\n size: { width: this.getInnerPanelWidth(), height: this.getInnerPanelHeight() },\n };\n\n setPanelAngularComponent({\n panelId: panel.id,\n angularComponent: loader.load(this.element, this.scopeProps, template),\n });\n }\n\n cleanUpAngularPanel() {\n const { angularComponent, setPanelAngularComponent, panel } = this.props;\n\n if (angularComponent) {\n angularComponent.destroy();\n }\n\n setPanelAngularComponent({ panelId: panel.id, angularComponent: null });\n }\n\n hasOverlayHeader() {\n const { panel } = this.props;\n const { errorMessage, data } = this.state;\n\n // always show normal header if we have an error message\n if (errorMessage) {\n return false;\n }\n\n // always show normal header if we have time override\n if (data.request && data.request.timeInfo) {\n return false;\n }\n\n return !panel.hasTitle();\n }\n\n render() {\n const { dashboard, panel, isViewing, isEditing, plugin } = this.props;\n const { errorMessage, data, alertState } = this.state;\n const { transparent } = panel;\n\n const containerClassNames = classNames({\n 'panel-container': true,\n 'panel-container--absolute': true,\n 'panel-container--transparent': transparent,\n 'panel-container--no-title': this.hasOverlayHeader(),\n 'panel-has-alert': panel.alert !== undefined,\n [`panel-alert-state--${alertState}`]: alertState !== undefined,\n });\n\n const panelContentClassNames = classNames({\n 'panel-content': true,\n 'panel-content--no-padding': plugin.noPadding,\n });\n\n return (\n
\n \n
\n
(this.element = element)} className=\"panel-height-helper\" />\n
\n
\n );\n }\n}\n\nconst mapStateToProps: MapStateToProps = (state, props) => {\n return {\n angularComponent: state.dashboard.panels[props.panel.id].angularComponent,\n };\n};\n\nconst mapDispatchToProps: MapDispatchToProps = { setPanelAngularComponent };\n\nexport const PanelChromeAngular = connect(mapStateToProps, mapDispatchToProps)(PanelChromeAngularUnconnected);\n","// Libraries\nimport React, { PureComponent } from 'react';\nimport classNames from 'classnames';\nimport AutoSizer from 'react-virtualized-auto-sizer';\nimport { connect, ConnectedProps } from 'react-redux';\n\n// Components\nimport { PanelChrome } from './PanelChrome';\nimport { PanelChromeAngular } from './PanelChromeAngular';\n\n// Actions\nimport { initDashboardPanel } from '../state/actions';\n\n// Types\nimport { DashboardModel, PanelModel } from '../state';\nimport { StoreState } from 'app/types';\nimport { PanelPlugin } from '@grafana/data';\n\nexport interface OwnProps {\n panel: PanelModel;\n dashboard: DashboardModel;\n isEditing: boolean;\n isViewing: boolean;\n isInView: boolean;\n}\n\nexport interface State {\n isLazy: boolean;\n}\n\nconst mapStateToProps = (state: StoreState, props: OwnProps) => {\n const panelState = state.dashboard.panels[props.panel.id];\n if (!panelState) {\n return { plugin: null };\n }\n\n return {\n plugin: panelState.plugin,\n };\n};\n\nconst mapDispatchToProps = { initDashboardPanel };\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type Props = OwnProps & ConnectedProps;\n\nexport class DashboardPanelUnconnected extends PureComponent {\n specialPanels: { [key: string]: Function } = {};\n\n constructor(props: Props) {\n super(props);\n\n this.state = {\n isLazy: !props.isInView,\n };\n }\n\n componentDidMount() {\n this.props.initDashboardPanel(this.props.panel);\n }\n\n componentDidUpdate() {\n if (this.state.isLazy && this.props.isInView) {\n this.setState({ isLazy: false });\n }\n }\n\n onMouseEnter = () => {\n this.props.dashboard.setPanelFocus(this.props.panel.id);\n };\n\n onMouseLeave = () => {\n this.props.dashboard.setPanelFocus(0);\n };\n\n renderPanel(plugin: PanelPlugin) {\n const { dashboard, panel, isViewing, isInView, isEditing } = this.props;\n\n return (\n \n {({ width, height }) => {\n if (width === 0) {\n return null;\n }\n\n if (plugin.angularPanelCtrl) {\n return (\n \n );\n }\n\n return (\n \n );\n }}\n \n );\n }\n\n render() {\n const { isViewing, plugin } = this.props;\n const { isLazy } = this.state;\n\n // if we have not loaded plugin exports yet, wait\n if (!plugin) {\n return null;\n }\n\n // If we are lazy state don't render anything\n if (isLazy) {\n return null;\n }\n\n const panelWrapperClass = classNames({\n 'panel-wrapper': true,\n 'panel-wrapper--view': isViewing,\n });\n\n return (\n
\n {this.renderPanel(plugin)}\n
\n );\n }\n}\n\nexport const DashboardPanel = connector(DashboardPanelUnconnected);\n"],"sourceRoot":""}