{"version":3,"file":"9569.817db115a7df4172282b.js","mappings":"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","sources":["webpack://grafana/./public/app/features/dashboard/dashgrid/LazyLoader.tsx","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelLinks.tsx","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderTitleItems.tsx","webpack://grafana/./public/app/features/dashboard/utils/getPanelChromeProps.tsx","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderMenu.tsx","webpack://grafana/./public/app/features/dashboard/utils/getPanelMenu.ts","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderMenuProvider.tsx","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderMenuWrapper.tsx","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelChromeAngular.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/overrides/colorSeriesConfigFactory.ts","webpack://grafana/./public/app/core/log_events.ts","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelLoadTimeMonitor.tsx","webpack://grafana/./public/app/features/dashboard/dashgrid/panelOptionsLogger.ts","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelStateWrapper.tsx","webpack://grafana/./public/app/features/dashboard/dashgrid/DashboardPanel.tsx","webpack://grafana/./public/app/features/dashboard/utils/loadSnapshotData.ts"],"sourcesContent":["import { useId, useRef, useState } from 'react';\nimport * as React from 'react';\nimport { useEffectOnce } from 'react-use';\n\nexport interface Props {\n children: React.ReactNode | (({ isInView }: { isInView: boolean }) => React.ReactNode);\n width?: number;\n height?: number;\n onLoad?: () => void;\n onChange?: (isInView: boolean) => void;\n}\n\nexport function LazyLoader({ children, width, height, onLoad, onChange }: Props) {\n const id = useId();\n const [loaded, setLoaded] = useState(false);\n const [isInView, setIsInView] = useState(false);\n const wrapperRef = useRef(null);\n\n useEffectOnce(() => {\n LazyLoader.addCallback(id, (entry) => {\n if (!loaded && entry.isIntersecting) {\n setLoaded(true);\n onLoad?.();\n }\n\n setIsInView(entry.isIntersecting);\n onChange?.(entry.isIntersecting);\n });\n\n const wrapperEl = wrapperRef.current;\n\n if (wrapperEl) {\n LazyLoader.observer.observe(wrapperEl);\n }\n\n return () => {\n delete LazyLoader.callbacks[id];\n wrapperEl && LazyLoader.observer.unobserve(wrapperEl);\n if (Object.keys(LazyLoader.callbacks).length === 0) {\n LazyLoader.observer.disconnect();\n }\n };\n });\n\n return (\n
\n {loaded && (typeof children === 'function' ? children({ isInView }) : children)}\n
\n );\n}\n\nconst callbacks: Record void> = {};\nLazyLoader.callbacks = callbacks;\nLazyLoader.addCallback = (id: string, c: (e: IntersectionObserverEntry) => void) => (LazyLoader.callbacks[id] = c);\nLazyLoader.observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (LazyLoader.callbacks[entry.target.id]) {\n LazyLoader.callbacks[entry.target.id](entry);\n }\n }\n },\n { rootMargin: '100px' }\n);\n","import { css } from '@emotion/css';\n\nimport { DataLink, GrafanaTheme2, LinkModel } from '@grafana/data';\nimport { Dropdown, Icon, Menu, ToolbarButton, useStyles2, PanelChrome } from '@grafana/ui';\n\ninterface Props {\n panelLinks: DataLink[];\n onShowPanelLinks: () => LinkModel[];\n}\n\nexport function PanelLinks({ panelLinks, onShowPanelLinks }: Props) {\n const styles = useStyles2(getStyles);\n\n const getLinksContent = (): JSX.Element => {\n const interpolatedLinks = onShowPanelLinks();\n return (\n \n {interpolatedLinks?.map((link, idx) => {\n return ;\n })}\n \n );\n };\n\n if (panelLinks.length === 1) {\n const linkModel = onShowPanelLinks()[0];\n return (\n \n \n \n );\n } else {\n return (\n \n \n \n );\n }\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n menuTrigger: css({\n height: '100%',\n background: 'inherit',\n border: 'none',\n borderRadius: `${theme.shape.radius.default}`,\n cursor: 'context-menu',\n }),\n };\n};\n","import { css, cx } from '@emotion/css';\n\nimport { PanelData, GrafanaTheme2, PanelModel, LinkModel, AlertState, DataLink } from '@grafana/data';\nimport { Icon, PanelChrome, Tooltip, useStyles2, TimePickerTooltip } from '@grafana/ui';\n\nimport { PanelLinks } from '../PanelLinks';\n\nimport { PanelHeaderNotices } from './PanelHeaderNotices';\n\nexport interface AngularNotice {\n show: boolean;\n isAngularPanel: boolean;\n isAngularDatasource: boolean;\n}\n\nexport interface Props {\n alertState?: string;\n data: PanelData;\n panelId: number;\n onShowPanelLinks?: () => Array>;\n panelLinks?: DataLink[];\n angularNotice?: AngularNotice;\n}\n\nexport function PanelHeaderTitleItems(props: Props) {\n const { alertState, data, panelId, onShowPanelLinks, panelLinks, angularNotice } = props;\n const styles = useStyles2(getStyles);\n\n // panel health\n const alertStateItem = (\n \n \n \n \n \n );\n\n const timeshift = (\n <>\n {data.request && data.request.timeInfo && (\n }>\n \n {data.request?.timeInfo}\n \n \n )}\n \n );\n\n const message = `This ${pluginType(angularNotice)} requires Angular (deprecated).`;\n const angularNoticeTooltip = (\n \n \n \n \n \n );\n\n return (\n <>\n {panelLinks && panelLinks.length > 0 && onShowPanelLinks && (\n \n )}\n\n {}\n {timeshift}\n {alertState && alertStateItem}\n {angularNotice?.show && angularNoticeTooltip}\n \n );\n}\n\nconst pluginType = (angularNotice?: AngularNotice): string => {\n if (angularNotice?.isAngularPanel) {\n return 'panel';\n }\n if (angularNotice?.isAngularDatasource) {\n return 'data source';\n }\n return 'panel or data source';\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n ok: css({\n color: theme.colors.success.text,\n '&:hover': {\n color: theme.colors.emphasize(theme.colors.success.text, 0.03),\n },\n }),\n pending: css({\n color: theme.colors.warning.text,\n '&:hover': {\n color: theme.colors.emphasize(theme.colors.warning.text, 0.03),\n },\n }),\n alerting: css({\n color: theme.colors.error.text,\n '&:hover': {\n color: theme.colors.emphasize(theme.colors.error.text, 0.03),\n },\n }),\n timeshift: css({\n color: theme.colors.text.link,\n gap: theme.spacing(0.5),\n whiteSpace: 'nowrap',\n\n '&:hover': {\n color: theme.colors.emphasize(theme.colors.text.link, 0.03),\n },\n }),\n angularNotice: css({\n color: theme.colors.warning.text,\n }),\n };\n};\n","import * as React from 'react';\n\nimport { LinkModel, PanelData, PanelPlugin, renderMarkdown } from '@grafana/data';\nimport { config, getTemplateSrv, locationService } from '@grafana/runtime';\nimport { PanelPadding } from '@grafana/ui';\nimport { DashboardInteractions } from 'app/features/dashboard-scene/utils/interactions';\nimport { InspectTab } from 'app/features/inspector/types';\nimport { getPanelLinksSupplier } from 'app/features/panel/panellinks/linkSuppliers';\nimport { isAngularDatasourcePluginAndNotHidden } from 'app/features/plugins/angularDeprecation/utils';\n\nimport { PanelHeaderTitleItems } from '../dashgrid/PanelHeader/PanelHeaderTitleItems';\nimport { DashboardModel, PanelModel } from '../state';\n\ninterface CommonProps {\n panel: PanelModel;\n data: PanelData;\n dashboard: DashboardModel;\n plugin: PanelPlugin;\n isViewing: boolean;\n isEditing: boolean;\n isInView: boolean;\n isDraggable?: boolean;\n width: number;\n height: number;\n hideMenu?: boolean;\n}\n\nexport function getPanelChromeProps(props: CommonProps) {\n function hasOverlayHeader() {\n // always show normal header if we have time override\n if (props.data.request && props.data.request.timeInfo) {\n return false;\n }\n\n return !props.panel.hasTitle();\n }\n\n const onShowPanelDescription = () => {\n const descriptionMarkdown = getTemplateSrv().replace(props.panel.description, props.panel.scopedVars);\n const interpolatedDescription = renderMarkdown(descriptionMarkdown);\n\n return interpolatedDescription;\n };\n\n const onShowPanelLinks = (): LinkModel[] => {\n const linkSupplier = getPanelLinksSupplier(props.panel);\n if (!linkSupplier) {\n return [];\n }\n const panelLinks = linkSupplier && linkSupplier.getLinks(props.panel.replaceVariables);\n\n return panelLinks.map((panelLink) => ({\n ...panelLink,\n onClick: (...args) => {\n DashboardInteractions.panelLinkClicked({ has_multiple_links: panelLinks.length > 1 });\n panelLink.onClick?.(...args);\n },\n }));\n };\n\n const onOpenInspector = (e: React.SyntheticEvent, tab: string) => {\n e.stopPropagation();\n locationService.partial({ inspect: props.panel.id, inspectTab: tab });\n };\n\n const onOpenErrorInspect = (e: React.SyntheticEvent) => {\n e.stopPropagation();\n locationService.partial({ inspect: props.panel.id, inspectTab: InspectTab.Error });\n DashboardInteractions.panelStatusMessageClicked();\n };\n\n const onCancelQuery = () => {\n props.panel.getQueryRunner().cancelQuery();\n DashboardInteractions.panelCancelQueryClicked({ data_state: props.data.state });\n };\n\n const padding: PanelPadding = props.plugin.noPadding ? 'none' : 'md';\n const alertState = props.data.alertState?.state;\n\n const isAngularDatasource = props.panel.datasource?.uid\n ? isAngularDatasourcePluginAndNotHidden(props.panel.datasource?.uid)\n : false;\n const isAngularPanel = props.panel.isAngularPlugin() && !props.plugin.meta.angular?.hideDeprecation;\n const showAngularNotice =\n (config.featureToggles.angularDeprecationUI ?? false) && (isAngularDatasource || isAngularPanel);\n\n const showTitleItems =\n (props.panel.links && props.panel.links.length > 0 && onShowPanelLinks) ||\n (props.data.series.length > 0 && props.data.series.some((v) => (v.meta?.notices?.length ?? 0) > 0)) ||\n (props.data.request && props.data.request.timeInfo) ||\n showAngularNotice ||\n alertState;\n\n const titleItems = showTitleItems && (\n \n );\n\n const description = props.panel.description ? onShowPanelDescription : undefined;\n\n const dragClass =\n !(props.isViewing || props.isEditing) && Boolean(props.isDraggable ?? true) ? 'grid-drag-handle' : '';\n\n const title = props.panel.getDisplayTitle();\n\n return {\n hasOverlayHeader,\n onShowPanelDescription,\n onShowPanelLinks,\n onOpenInspector,\n onOpenErrorInspect,\n onCancelQuery,\n padding,\n description,\n dragClass,\n title,\n titleItems,\n };\n}\n","import * as React from 'react';\n\nimport { PanelMenuItem } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Menu } from '@grafana/ui';\n\nexport interface Props {\n items: PanelMenuItem[];\n style?: React.CSSProperties;\n itemsClassName?: string;\n className?: string;\n}\n\nexport function PanelHeaderMenu({ items }: Props) {\n const renderItems = (items: PanelMenuItem[]) => {\n return items.map((item) => {\n switch (item.type) {\n case 'divider':\n return ;\n case 'group':\n return (\n \n {item.subMenu ? renderItems(item.subMenu) : undefined}\n \n );\n default:\n return (\n \n );\n }\n });\n };\n\n return {renderItems(items)};\n}\n","import { PanelMenuItem, urlUtil, PluginExtensionLink } from '@grafana/data';\nimport { AngularComponent, locationService } from '@grafana/runtime';\nimport { PanelCtrl } from 'app/angular/panel/panel_ctrl';\nimport config from 'app/core/config';\nimport { createErrorNotification } from 'app/core/copy/appNotification';\nimport { t } from 'app/core/internationalization';\nimport { notifyApp } from 'app/core/reducers/appNotification';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { getMessageFromError } from 'app/core/utils/errors';\nimport { getExploreUrl } from 'app/core/utils/explore';\nimport { RuleFormValues } from 'app/features/alerting/unified/types/rule-form';\nimport { panelToRuleFormValues } from 'app/features/alerting/unified/utils/rule-form';\nimport { DashboardModel } from 'app/features/dashboard/state/DashboardModel';\nimport { PanelModel } from 'app/features/dashboard/state/PanelModel';\nimport {\n addLibraryPanel,\n copyPanel,\n duplicatePanel,\n removePanel,\n sharePanel,\n toggleLegend,\n unlinkLibraryPanel,\n} from 'app/features/dashboard/utils/panel';\nimport { InspectTab } from 'app/features/inspector/types';\nimport { isPanelModelLibraryPanel } from 'app/features/library-panels/guard';\nimport { createExtensionSubMenu } from 'app/features/plugins/extensions/utils';\nimport { SHARED_DASHBOARD_QUERY } from 'app/plugins/datasource/dashboard';\nimport { dispatch, store } from 'app/store/store';\n\nimport { getCreateAlertInMenuAvailability } from '../../alerting/unified/utils/access-control';\nimport { navigateToExplore } from '../../explore/state/main';\nimport { getTimeSrv } from '../services/TimeSrv';\n\nexport function getPanelMenu(\n dashboard: DashboardModel,\n panel: PanelModel,\n extensions: PluginExtensionLink[],\n angularComponent?: AngularComponent | null\n): PanelMenuItem[] {\n const onViewPanel = (event: React.MouseEvent) => {\n event.preventDefault();\n locationService.partial({\n viewPanel: panel.id,\n });\n };\n\n const onEditPanel = (event: React.MouseEvent) => {\n event.preventDefault();\n locationService.partial({\n editPanel: panel.id,\n });\n };\n\n const onSharePanel = (event: React.MouseEvent) => {\n event.preventDefault();\n sharePanel(dashboard, panel);\n };\n\n const onAddLibraryPanel = (event: React.MouseEvent) => {\n event.preventDefault();\n addLibraryPanel(dashboard, panel);\n };\n\n const onUnlinkLibraryPanel = (event: React.MouseEvent) => {\n event.preventDefault();\n unlinkLibraryPanel(panel);\n };\n\n const onInspectPanel = (tab?: InspectTab) => {\n locationService.partial({\n inspect: panel.id,\n inspectTab: tab,\n });\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(\n navigateToExplore(panel, {\n timeRange: getTimeSrv().timeRange(),\n getExploreUrl,\n openInNewWindow,\n }) as any\n );\n };\n\n const onToggleLegend = (event: React.MouseEvent) => {\n event.preventDefault();\n toggleLegend(panel);\n };\n\n const menu: PanelMenuItem[] = [];\n\n if (!panel.isEditing) {\n menu.push({\n text: t('panel.header-menu.view', `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: t('panel.header-menu.edit', `Edit`),\n iconClassName: 'edit',\n onClick: onEditPanel,\n shortcut: 'e',\n });\n }\n\n menu.push({\n text: t('panel.header-menu.share', `Share`),\n iconClassName: 'share-alt',\n onClick: onSharePanel,\n shortcut: 'p s',\n });\n\n if (\n contextSrv.hasAccessToExplore() &&\n !(panel.plugin && panel.plugin.meta.skipDataQuery) &&\n panel.datasource?.uid !== SHARED_DASHBOARD_QUERY\n ) {\n menu.push({\n text: t('panel.header-menu.explore', `Explore`),\n iconClassName: 'compass',\n onClick: onNavigateToExplore,\n shortcut: 'p x',\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: t('panel.header-menu.inspect-data', `Data`),\n onClick: (e: React.MouseEvent) => onInspectPanel(InspectTab.Data),\n });\n\n if (dashboard.meta.canEdit) {\n inspectMenu.push({\n text: t('panel.header-menu.query', `Query`),\n onClick: (e: React.MouseEvent) => onInspectPanel(InspectTab.Query),\n });\n }\n }\n\n inspectMenu.push({\n text: t('panel.header-menu.inspect-json', `Panel JSON`),\n onClick: (e: React.MouseEvent) => onInspectPanel(InspectTab.JSON),\n });\n\n menu.push({\n type: 'submenu',\n text: t('panel.header-menu.inspect', `Inspect`),\n iconClassName: 'info-circle',\n shortcut: 'i',\n subMenu: inspectMenu,\n });\n\n const createAlert = async () => {\n let formValues: Partial | undefined;\n try {\n formValues = await panelToRuleFormValues(panel, dashboard);\n } catch (err) {\n const message = `Error getting rule values from the panel: ${getMessageFromError(err)}`;\n dispatch(notifyApp(createErrorNotification(message)));\n return;\n }\n const ruleFormUrl = urlUtil.renderUrl('/alerting/new', {\n defaults: JSON.stringify(formValues),\n returnTo: location.pathname + location.search,\n });\n\n locationService.push(ruleFormUrl);\n };\n\n const onCreateAlert = (event: React.MouseEvent) => {\n event.preventDefault();\n createAlert();\n };\n\n const subMenu: PanelMenuItem[] = [];\n const canEdit = dashboard.canEditPanel(panel);\n const isCreateAlertMenuOptionAvailable = getCreateAlertInMenuAvailability();\n\n if (!(panel.isViewing || panel.isEditing)) {\n if (canEdit) {\n subMenu.push({\n text: t('panel.header-menu.duplicate', `Duplicate`),\n onClick: onDuplicatePanel,\n shortcut: 'p d',\n });\n\n subMenu.push({\n text: t('panel.header-menu.copy', `Copy`),\n onClick: onCopyPanel,\n });\n\n if (isPanelModelLibraryPanel(panel)) {\n subMenu.push({\n text: t('panel.header-menu.unlink-library-panel', `Unlink library panel`),\n onClick: onUnlinkLibraryPanel,\n });\n } else {\n subMenu.push({\n text: t('panel.header-menu.create-library-panel', `Create library panel`),\n onClick: onAddLibraryPanel,\n });\n }\n } else if (contextSrv.isEditor) {\n // An editor but the dashboard is not editable\n subMenu.push({\n text: t('panel.header-menu.copy', `Copy`),\n onClick: onCopyPanel,\n });\n }\n }\n\n if (isCreateAlertMenuOptionAvailable) {\n subMenu.push({\n text: t('panel.header-menu.new-alert-rule', `New alert rule`),\n onClick: onCreateAlert,\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.options.legend) {\n subMenu.push({\n text: panel.options.legend.showLegend\n ? t('panel.header-menu.hide-legend', 'Hide legend')\n : t('panel.header-menu.show-legend', 'Show legend'),\n onClick: onToggleLegend,\n shortcut: 'p l',\n });\n }\n\n // When editing hide most actions\n if (panel.isEditing) {\n subMenu.length = 0;\n if (isCreateAlertMenuOptionAvailable) {\n subMenu.push({\n text: t('panel.header-menu.new-alert-rule', `New alert rule`),\n onClick: onCreateAlert,\n });\n }\n }\n\n if (canEdit && panel.plugin && !panel.plugin.meta.skipDataQuery) {\n subMenu.push({\n text: t('panel.header-menu.get-help', 'Get help'),\n onClick: (e: React.MouseEvent) => onInspectPanel(InspectTab.Help),\n });\n }\n\n if (extensions.length > 0 && !panel.isEditing) {\n menu.push({\n text: 'Extensions',\n iconClassName: 'plug',\n type: 'submenu',\n subMenu: createExtensionSubMenu(extensions),\n });\n }\n\n if (subMenu.length) {\n menu.push({\n type: 'submenu',\n text: t('panel.header-menu.more', `More...`),\n iconClassName: 'cube',\n subMenu,\n });\n }\n\n if (dashboard.canEditPanel(panel) && !panel.isEditing && !panel.isViewing) {\n menu.push({ type: 'divider', text: '' });\n\n menu.push({\n text: t('panel.header-menu.remove', `Remove`),\n iconClassName: 'trash-alt',\n onClick: onRemovePanel,\n shortcut: 'p r',\n });\n }\n\n return menu;\n}\n","import { ReactElement, useEffect, useMemo, useState } from 'react';\n\nimport {\n LoadingState,\n PanelMenuItem,\n PluginExtensionPanelContext,\n PluginExtensionPoints,\n getTimeZone,\n} from '@grafana/data';\nimport { usePluginLinks } from '@grafana/runtime';\nimport { getPanelStateForModel } from 'app/features/panel/state/selectors';\nimport { useSelector } from 'app/types';\n\nimport { DashboardModel, PanelModel } from '../../state';\nimport { getPanelMenu } from '../../utils/getPanelMenu';\n\ninterface PanelHeaderMenuProviderApi {\n items: PanelMenuItem[];\n}\n\ninterface Props {\n panel: PanelModel;\n dashboard: DashboardModel;\n loadingState?: LoadingState;\n children: (props: PanelHeaderMenuProviderApi) => ReactElement;\n}\n\nexport function PanelHeaderMenuProvider({ panel, dashboard, loadingState, children }: Props) {\n const [items, setItems] = useState([]);\n const angularComponent = useSelector((state) => getPanelStateForModel(state, panel)?.angularComponent);\n const context = useMemo(() => createExtensionContext(panel, dashboard), [panel, dashboard]);\n const { links } = usePluginLinks({\n extensionPointId: PluginExtensionPoints.DashboardPanelMenu,\n context,\n limitPerPlugin: 3,\n });\n\n useEffect(() => {\n setItems(getPanelMenu(dashboard, panel, links, angularComponent));\n }, [dashboard, panel, angularComponent, loadingState, setItems, links]);\n\n return children({ items });\n}\n\nfunction createExtensionContext(panel: PanelModel, dashboard: DashboardModel): PluginExtensionPanelContext {\n return {\n id: panel.id,\n pluginId: panel.type,\n title: panel.title,\n timeRange: dashboard.time,\n timeZone: getTimeZone({\n timeZone: dashboard.timezone,\n }),\n dashboard: {\n uid: dashboard.uid,\n title: dashboard.title,\n tags: Array.from(dashboard.tags),\n },\n targets: panel.targets,\n scopedVars: panel.scopedVars,\n data: panel.getQueryRunner().getLastResult(),\n };\n}\n","import * as React from 'react';\n\nimport { LoadingState } from '@grafana/data';\n\nimport { DashboardModel, PanelModel } from '../../state';\n\nimport { PanelHeaderMenu } from './PanelHeaderMenu';\nimport { PanelHeaderMenuProvider } from './PanelHeaderMenuProvider';\n\ninterface Props {\n panel: PanelModel;\n dashboard: DashboardModel;\n loadingState?: LoadingState;\n style?: React.CSSProperties;\n menuItemsClassName?: string;\n menuWrapperClassName?: string;\n}\n\nexport function PanelHeaderMenuWrapper({ style, panel, dashboard, loadingState }: Props) {\n return (\n \n {({ items }) => }\n \n );\n}\n","import { PureComponent } from 'react';\nimport { connect, MapDispatchToProps, MapStateToProps } from 'react-redux';\nimport { Subscription } from 'rxjs';\n\nimport { getDefaultTimeRange, LoadingState, PanelData, PanelPlugin } from '@grafana/data';\nimport { AngularComponent, getAngularLoader } from '@grafana/runtime';\nimport { PanelChrome } from '@grafana/ui';\nimport config from 'app/core/config';\nimport { PANEL_BORDER } from 'app/core/constants';\nimport { setPanelAngularComponent } from 'app/features/panel/state/reducers';\nimport { getPanelStateForModel } from 'app/features/panel/state/selectors';\nimport { StoreState } from 'app/types';\n\nimport { getTimeSrv, TimeSrv } from '../services/TimeSrv';\nimport { DashboardModel, PanelModel } from '../state';\nimport { getPanelChromeProps } from '../utils/getPanelChromeProps';\n\nimport { PanelHeaderMenuWrapper } from './PanelHeader/PanelHeaderMenuWrapper';\n\ninterface OwnProps {\n panel: PanelModel;\n dashboard: DashboardModel;\n plugin: PanelPlugin;\n isViewing: boolean;\n isEditing: boolean;\n isInView: boolean;\n isDraggable?: boolean;\n width: number;\n height: number;\n hideMenu?: boolean;\n}\n\ninterface ConnectedProps {\n angularComponent?: AngularComponent;\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}\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 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\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.subs.unsubscribe();\n if (this.props.angularComponent) {\n this.props.angularComponent?.destroy();\n }\n }\n\n componentDidUpdate(prevProps: Props, prevState: State) {\n const { plugin, height, width, panel } = this.props;\n\n if (prevProps.plugin !== plugin) {\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 key: panel.key,\n angularComponent: loader.load(this.element, this.scopeProps, template),\n });\n }\n\n hasOverlayHeader() {\n const { panel } = this.props;\n const { data } = this.state;\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 } = this.props;\n const { errorMessage, data } = this.state;\n const { transparent } = panel;\n\n const panelChromeProps = getPanelChromeProps({ ...this.props, data });\n\n // Shift the hover menu down if it's on the top row so it doesn't get clipped by topnav\n const hoverHeaderOffset = (panel.gridPos?.y ?? 0) === 0 ? -16 : undefined;\n\n const menu = (\n
\n \n
\n );\n\n return (\n \n {() =>
(this.element = element)} className=\"panel-height-helper\" />}\n \n );\n }\n}\n\nconst mapStateToProps: MapStateToProps = (state, props) => {\n return {\n angularComponent: getPanelStateForModel(state, props.panel)?.angularComponent,\n };\n};\n\nconst mapDispatchToProps: MapDispatchToProps = { setPanelAngularComponent };\n\nexport const PanelChromeAngular = connect(mapStateToProps, mapDispatchToProps)(PanelChromeAngularUnconnected);\n","import {\n ConfigOverrideRule,\n DynamicConfigValue,\n FieldColorModeId,\n FieldConfigSource,\n FieldMatcherID,\n} from '@grafana/data';\n\nexport const changeSeriesColorConfigFactory = (\n label: string,\n color: string,\n fieldConfig: FieldConfigSource\n): FieldConfigSource => {\n const { overrides } = fieldConfig;\n const currentIndex = fieldConfig.overrides.findIndex((override) => {\n return override.matcher.id === FieldMatcherID.byName && override.matcher.options === label;\n });\n\n if (currentIndex < 0) {\n return {\n ...fieldConfig,\n overrides: [...fieldConfig.overrides, createOverride(label, color)],\n };\n }\n\n const overridesCopy = Array.from(overrides);\n const existing = overridesCopy[currentIndex];\n const propertyIndex = existing.properties.findIndex((p) => p.id === 'color');\n\n if (propertyIndex < 0) {\n overridesCopy[currentIndex] = {\n ...existing,\n properties: [...existing.properties, createProperty(color)],\n };\n\n return {\n ...fieldConfig,\n overrides: overridesCopy,\n };\n }\n\n const propertiesCopy = Array.from(existing.properties);\n propertiesCopy[propertyIndex] = createProperty(color);\n\n overridesCopy[currentIndex] = {\n ...existing,\n properties: propertiesCopy,\n };\n\n return {\n ...fieldConfig,\n overrides: overridesCopy,\n };\n};\n\nconst createOverride = (label: string, color: string): ConfigOverrideRule => {\n return {\n matcher: {\n id: FieldMatcherID.byName,\n options: label,\n },\n properties: [createProperty(color)],\n };\n};\n\nconst createProperty = (color: string): DynamicConfigValue => {\n return {\n id: 'color',\n value: {\n mode: FieldColorModeId.Fixed,\n fixedColor: color,\n },\n };\n};\n","export enum PanelLogEvents {\n FIELD_CONFIG_OVERRIDES_CHANGED_EVENT = 'field config overrides changed',\n NEW_PANEL_OPTION_EVENT = 'new panel option',\n PANEL_OPTION_CHANGED_EVENT = 'panel option changed',\n NEW_DEFAULT_FIELD_CONFIG_EVENT = 'new default field config',\n DEFAULT_FIELD_CONFIG_CHANGED_EVENT = 'default field config changed',\n NEW_CUSTOM_FIELD_CONFIG_EVENT = 'new custom field config',\n CUSTOM_FIELD_CONFIG_CHANGED_EVENT = 'custom field config changed',\n MEASURE_PANEL_LOAD_TIME_EVENT = 'measure panel load time',\n THRESHOLDS_COUNT_CHANGED_EVENT = 'thresholds count changed',\n THRESHOLDS_MODE_CHANGED_EVENT = 'thresholds mode changed',\n MAPPINGS_COUNT_CHANGED_EVENT = 'mappings count changed',\n LINKS_COUNT_CHANGED_EVENT = 'links count changed',\n PANEL_ERROR = 'panel error',\n}\n\nexport const FIELD_CONFIG_OVERRIDES_KEY = 'overrides';\nexport const FIELD_CONFIG_CUSTOM_KEY = 'custom';\n","import { useEffect } from 'react';\n\nimport { faro } from '@grafana/faro-web-sdk';\nimport { config } from 'app/core/config';\nimport { PanelLogEvents } from 'app/core/log_events';\n\ninterface Props {\n panelType: string;\n panelId: number;\n panelTitle: string;\n}\n\nexport const PanelLoadTimeMonitor = (props: Props) => {\n const startLoadTime = performance.now();\n\n useEffect(() => {\n if (!config.grafanaJavascriptAgent.enabled) {\n return;\n }\n\n // This code will be run ASAP after Style and Layout information have\n // been calculated and the paint has occurred.\n // https://firefox-source-docs.mozilla.org/performance/bestpractices.html\n requestAnimationFrame(() => {\n setTimeout(() => {\n faro.api.pushMeasurement(\n {\n type: PanelLogEvents.MEASURE_PANEL_LOAD_TIME_EVENT,\n values: {\n start_loading_time_ms: startLoadTime,\n load_time_ms: performance.now() - startLoadTime,\n },\n },\n {\n context: {\n panel_type: props.panelType,\n panel_id: String(props.panelId),\n panel_title: props.panelTitle,\n },\n }\n );\n }, 0);\n });\n\n return;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return null;\n};\n","import { FieldConfigSource } from '@grafana/data';\nimport { faro } from '@grafana/faro-web-sdk';\nimport { config } from 'app/core/config';\nimport { FIELD_CONFIG_CUSTOM_KEY, FIELD_CONFIG_OVERRIDES_KEY, PanelLogEvents } from 'app/core/log_events';\n\ninterface PanelLogInfo {\n panelId: string;\n panelType: string;\n panelTitle: string;\n}\n\nexport class PanelOptionsLogger {\n private initialPanelOptions: unknown;\n private initialFieldConfig: FieldConfigSource;\n private panelLogInfo: PanelLogInfo;\n\n constructor(initialPanelOptions: unknown, initialFieldConfig: FieldConfigSource, panelLogInfo: PanelLogInfo) {\n this.initialPanelOptions = initialPanelOptions;\n this.initialFieldConfig = initialFieldConfig;\n this.panelLogInfo = panelLogInfo;\n }\n\n logChanges = (latestPanelOptions: unknown, latestFieldConfig: FieldConfigSource) => {\n this.logPanelOptionChanges(latestPanelOptions, this.initialPanelOptions);\n this.logFieldConfigChanges(latestFieldConfig, this.initialFieldConfig);\n\n //set the old values to the current values for next log diff\n this.initialPanelOptions = latestPanelOptions;\n this.initialFieldConfig = latestFieldConfig;\n };\n\n logPanelEvent = (eventName: string, newKey: string, newVal: string, oldVal?: string) => {\n if (!config.grafanaJavascriptAgent.enabled) {\n return;\n }\n const logObj = {\n key: newKey,\n newValue: newVal,\n oldValue: oldVal ?? '',\n panelTitle: this.panelLogInfo.panelTitle,\n panelId: this.panelLogInfo.panelId,\n panelType: this.panelLogInfo.panelType,\n };\n\n faro.api.pushEvent(eventName, logObj);\n };\n\n logPanelOptionChanges = (panelOptions: unknown, oldPanelOptions: unknown) => {\n if (typeof panelOptions !== 'object' || panelOptions === null) {\n return;\n }\n\n if (typeof oldPanelOptions !== 'object' || oldPanelOptions === null) {\n return;\n }\n\n const oldPanelOptionsUnknown: { [key: string]: unknown } = { ...oldPanelOptions };\n\n for (const [key, value] of Object.entries(panelOptions)) {\n const newValue: string = typeof value !== 'string' ? JSON.stringify(value) : value;\n const oldValue: string =\n typeof value !== 'string' ? JSON.stringify(oldPanelOptionsUnknown[key]) : String(oldPanelOptionsUnknown[key]);\n\n if (oldPanelOptionsUnknown[key] === undefined) {\n this.logPanelEvent(PanelLogEvents.NEW_PANEL_OPTION_EVENT, key, newValue);\n } else if (oldValue !== newValue) {\n this.logPanelEvent(PanelLogEvents.PANEL_OPTION_CHANGED_EVENT, key, newValue, oldValue);\n }\n }\n };\n\n logFieldConfigChanges = (fieldConfig: FieldConfigSource, oldFieldConfig: FieldConfigSource) => {\n // overrides are an array of objects, so stringify it all and log changes\n // in lack of an index, we can't tell which override changed\n const oldOverridesStr = JSON.stringify(oldFieldConfig.overrides);\n const newOverridesStr = JSON.stringify(fieldConfig.overrides);\n if (oldOverridesStr !== newOverridesStr) {\n this.logPanelEvent(\n PanelLogEvents.FIELD_CONFIG_OVERRIDES_CHANGED_EVENT,\n FIELD_CONFIG_OVERRIDES_KEY,\n newOverridesStr,\n oldOverridesStr\n );\n }\n\n const oldDefaults: { [key: string]: unknown } = { ...oldFieldConfig.defaults };\n\n // go through field config keys except custom, we treat that below\n for (const [key, value] of Object.entries(fieldConfig.defaults)) {\n if (key === FIELD_CONFIG_CUSTOM_KEY) {\n continue;\n }\n\n const newValue: string = typeof value !== 'string' ? JSON.stringify(value) : value;\n const oldValue: string = typeof value !== 'string' ? JSON.stringify(oldDefaults[key]) : String(oldDefaults[key]);\n\n if (oldDefaults[key] === undefined) {\n this.logPanelEvent(PanelLogEvents.NEW_DEFAULT_FIELD_CONFIG_EVENT, key, newValue);\n } else if (oldValue !== newValue) {\n this.logPanelEvent(PanelLogEvents.DEFAULT_FIELD_CONFIG_CHANGED_EVENT, key, newValue, oldValue);\n }\n }\n\n if (!fieldConfig.defaults.custom || oldDefaults.custom === undefined) {\n return;\n }\n\n const oldCustom: { [key: string]: unknown } = { ...oldDefaults.custom };\n\n // go through custom field config keys\n for (const [key, value] of Object.entries(fieldConfig.defaults.custom)) {\n if (oldDefaults.custom === null || oldCustom[key] === null) {\n continue;\n }\n\n const newValue: string = typeof value !== 'string' ? JSON.stringify(value) : value;\n const oldValue: string = typeof value !== 'string' ? JSON.stringify(oldCustom[key]) : String(oldCustom[key]);\n\n if (oldCustom[key] === undefined) {\n this.logPanelEvent(PanelLogEvents.NEW_CUSTOM_FIELD_CONFIG_EVENT, key, newValue);\n } else if (oldValue !== newValue) {\n this.logPanelEvent(PanelLogEvents.CUSTOM_FIELD_CONFIG_CHANGED_EVENT, key, newValue, oldValue);\n }\n }\n };\n}\n","import { debounce } from 'lodash';\nimport { PureComponent } from 'react';\nimport { Subscription } from 'rxjs';\n\nimport {\n AbsoluteTimeRange,\n AnnotationChangeEvent,\n AnnotationEventUIModel,\n CoreApp,\n DashboardCursorSync,\n DataFrame,\n EventFilterOptions,\n FieldConfigSource,\n getDataSourceRef,\n getDefaultTimeRange,\n LoadingState,\n PanelData,\n PanelPlugin,\n PanelPluginMeta,\n SetPanelAttentionEvent,\n TimeRange,\n toDataFrameDTO,\n toUtc,\n} from '@grafana/data';\nimport { RefreshEvent } from '@grafana/runtime';\nimport { VizLegendOptions } from '@grafana/schema';\nimport {\n ErrorBoundary,\n PanelChrome,\n PanelContext,\n PanelContextProvider,\n SeriesVisibilityChangeMode,\n AdHocFilterItem,\n} from '@grafana/ui';\nimport appEvents from 'app/core/app_events';\nimport config from 'app/core/config';\nimport { profiler } from 'app/core/profiler';\nimport { applyPanelTimeOverrides } from 'app/features/dashboard/utils/panel';\nimport { getDatasourceSrv } from 'app/features/plugins/datasource_srv';\nimport { applyFilterFromTable } from 'app/features/variables/adhoc/actions';\nimport { onUpdatePanelSnapshotData } from 'app/plugins/datasource/grafana/utils';\nimport { changeSeriesColorConfigFactory } from 'app/plugins/panel/timeseries/overrides/colorSeriesConfigFactory';\nimport { dispatch } from 'app/store/store';\nimport { RenderEvent } from 'app/types/events';\n\nimport { deleteAnnotation, saveAnnotation, updateAnnotation } from '../../annotations/api';\nimport { getDashboardQueryRunner } from '../../query/state/DashboardQueryRunner/DashboardQueryRunner';\nimport { getTimeSrv, TimeSrv } from '../services/TimeSrv';\nimport { DashboardModel, PanelModel } from '../state';\nimport { getPanelChromeProps } from '../utils/getPanelChromeProps';\nimport { loadSnapshotData } from '../utils/loadSnapshotData';\n\nimport { PanelHeaderMenuWrapper } from './PanelHeader/PanelHeaderMenuWrapper';\nimport { PanelLoadTimeMonitor } from './PanelLoadTimeMonitor';\nimport { seriesVisibilityConfigFactory } from './SeriesVisibilityConfigFactory';\nimport { liveTimer } from './liveTimer';\nimport { PanelOptionsLogger } from './panelOptionsLogger';\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 isDraggable?: boolean;\n width: number;\n height: number;\n onInstanceStateChange: (value: unknown) => void;\n timezone?: string;\n hideMenu?: boolean;\n}\n\nexport interface State {\n isFirstLoad: boolean;\n renderCounter: number;\n errorMessage?: string;\n context: PanelContext;\n data: PanelData;\n liveTime?: TimeRange;\n}\n\nexport class PanelStateWrapper extends PureComponent {\n private readonly timeSrv: TimeSrv = getTimeSrv();\n private subs = new Subscription();\n private eventFilter: EventFilterOptions = { onlyLocal: true };\n private panelOptionsLogger: PanelOptionsLogger | undefined = undefined;\n\n constructor(props: Props) {\n super(props);\n\n // Can this eventBus be on PanelModel? when we have more complex event filtering, that may be a better option\n const eventBus = props.dashboard.events.newScopedBus(`panel:${props.panel.id}`, this.eventFilter);\n this.debouncedSetPanelAttention = debounce(this.setPanelAttention.bind(this), 100);\n\n this.state = {\n isFirstLoad: true,\n renderCounter: 0,\n context: {\n eventsScope: '__global_',\n eventBus,\n app: this.getPanelContextApp(),\n sync: this.getSync,\n onSeriesColorChange: this.onSeriesColorChange,\n onToggleSeriesVisibility: this.onSeriesVisibilityChange,\n onAnnotationCreate: this.onAnnotationCreate,\n onAnnotationUpdate: this.onAnnotationUpdate,\n onAnnotationDelete: this.onAnnotationDelete,\n onInstanceStateChange: this.onInstanceStateChange,\n onToggleLegendSort: this.onToggleLegendSort,\n canAddAnnotations: props.dashboard.canAddAnnotations.bind(props.dashboard),\n canEditAnnotations: props.dashboard.canEditAnnotations.bind(props.dashboard),\n canDeleteAnnotations: props.dashboard.canDeleteAnnotations.bind(props.dashboard),\n onAddAdHocFilter: this.onAddAdHocFilter,\n onUpdateData: this.onUpdateData,\n },\n data: this.getInitialPanelDataState(),\n };\n\n if (config.featureToggles.panelMonitoring && this.getPanelContextApp() === CoreApp.PanelEditor) {\n const panelInfo = {\n panelId: String(props.panel.id),\n panelType: props.panel.type,\n panelTitle: props.panel.title,\n };\n\n this.panelOptionsLogger = new PanelOptionsLogger(props.panel.getOptions(), props.panel.fieldConfig, panelInfo);\n }\n }\n\n // Due to a mutable panel model we get the sync settings via function that proactively reads from the model\n getSync = () => (this.props.isEditing ? DashboardCursorSync.Off : this.props.dashboard.graphTooltip);\n\n onInstanceStateChange = (value: unknown) => {\n this.props.onInstanceStateChange(value);\n\n this.setState({\n context: {\n ...this.state.context,\n instanceState: value,\n },\n });\n };\n\n getPanelContextApp() {\n if (this.props.isEditing) {\n return CoreApp.PanelEditor;\n }\n if (this.props.isViewing) {\n return CoreApp.PanelViewer;\n }\n\n return CoreApp.Dashboard;\n }\n\n onUpdateData = (frames: DataFrame[]): Promise => {\n return onUpdatePanelSnapshotData(this.props.panel, frames);\n };\n\n onSeriesColorChange = (label: string, color: string) => {\n this.onFieldConfigChange(changeSeriesColorConfigFactory(label, color, this.props.panel.fieldConfig));\n };\n\n onSeriesVisibilityChange = (label: string, mode: SeriesVisibilityChangeMode) => {\n this.onFieldConfigChange(\n seriesVisibilityConfigFactory(label, mode, this.props.panel.fieldConfig, this.state.data.series)\n );\n };\n\n onToggleLegendSort = (sortKey: string) => {\n const legendOptions: VizLegendOptions = this.props.panel.options.legend;\n\n // We don't want to do anything when legend options are not available\n if (!legendOptions) {\n return;\n }\n\n let sortDesc = legendOptions.sortDesc;\n let sortBy = legendOptions.sortBy;\n if (sortKey !== sortBy) {\n sortDesc = undefined;\n }\n\n // if already sort ascending, disable sorting\n if (sortDesc === false) {\n sortBy = undefined;\n sortDesc = undefined;\n } else {\n sortDesc = !sortDesc;\n sortBy = sortKey;\n }\n\n this.onOptionsChange({\n ...this.props.panel.options,\n legend: { ...legendOptions, sortBy, sortDesc },\n });\n };\n\n getInitialPanelDataState(): PanelData {\n return {\n state: LoadingState.NotStarted,\n series: [],\n timeRange: getDefaultTimeRange(),\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 // Listen for live timer events\n liveTimer.listen(this);\n }\n\n componentWillUnmount() {\n this.subs.unsubscribe();\n liveTimer.remove(this);\n }\n\n liveTimeChanged(liveTime: TimeRange) {\n const { data } = this.state;\n if (data.timeRange) {\n const delta = liveTime.to.valueOf() - data.timeRange.to.valueOf();\n if (delta < 100) {\n // 10hz\n console.log('Skip tick render', this.props.panel.title, delta);\n return;\n }\n }\n this.setState({ liveTime });\n }\n\n componentDidUpdate(prevProps: Props) {\n const { isInView, width, panel } = this.props;\n const { context } = this.state;\n\n const app = this.getPanelContextApp();\n\n if (context.app !== app) {\n this.setState({\n context: {\n ...context,\n app,\n },\n });\n }\n\n // View state has changed\n if (isInView !== prevProps.isInView) {\n if (isInView) {\n // Check if we need a delayed refresh\n if (panel.refreshWhenInView) {\n this.onRefresh();\n }\n }\n }\n\n // The timer depends on panel width\n if (width !== prevProps.width) {\n liveTimer.updateInterval(this);\n }\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 const { dashboard, panel, plugin } = this.props;\n\n // Ignore this data update if we are now a non data panel\n if (plugin.meta.skipDataQuery) {\n this.setState({ data: this.getInitialPanelDataState() });\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, errors } = data;\n if (errors?.length) {\n if (errors.length === 1) {\n errorMessage = errors[0].message;\n } else {\n errorMessage = 'Multiple errors found. Click for more details';\n }\n } else 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 (dashboard.snapshot) {\n 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, liveTime: undefined });\n }\n\n onRefresh = () => {\n const { dashboard, panel, isInView, width } = this.props;\n\n if (!dashboard.snapshot && !isInView) {\n panel.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.refreshWhenInView = false;\n panel.runAllPanelQueries({\n dashboardUID: dashboard.uid,\n dashboardTimezone: dashboard.getTimezone(),\n timeData,\n width,\n });\n } else {\n // The panel should render on refresh as well if it doesn't have a query, like clock panel\n this.setState({\n data: { ...this.state.data, timeRange: this.timeSrv.timeRange() },\n renderCounter: this.state.renderCounter + 1,\n liveTime: undefined,\n });\n }\n };\n\n onRender = () => {\n const stateUpdate = { renderCounter: this.state.renderCounter + 1 };\n this.setState(stateUpdate);\n };\n\n onOptionsChange = (options: object) => {\n this.props.panel.updateOptions(options);\n };\n\n onFieldConfigChange = (config: FieldConfigSource) => {\n this.props.panel.updateFieldConfig(config);\n };\n\n logPanelChangesOnError() {\n this.panelOptionsLogger!.logChanges(this.props.panel.getOptions(), this.props.panel.fieldConfig);\n }\n\n onPanelError = (error: Error) => {\n if (config.featureToggles.panelMonitoring && this.getPanelContextApp() === CoreApp.PanelEditor) {\n this.logPanelChangesOnError();\n }\n\n const errorMessage = error.message || DEFAULT_PLUGIN_ERROR;\n\n if (this.state.errorMessage !== errorMessage) {\n this.setState({ errorMessage });\n }\n };\n\n onPanelErrorRecover = () => {\n this.setState({ errorMessage: undefined });\n };\n\n onAnnotationCreate = async (event: AnnotationEventUIModel) => {\n const isRegion = event.from !== event.to;\n const anno = {\n dashboardUID: this.props.dashboard.uid,\n panelId: this.props.panel.id,\n isRegion,\n time: event.from,\n timeEnd: isRegion ? event.to : 0,\n tags: event.tags,\n text: event.description,\n };\n await saveAnnotation(anno);\n getDashboardQueryRunner().run({ dashboard: this.props.dashboard, range: this.timeSrv.timeRange() });\n this.state.context.eventBus.publish(new AnnotationChangeEvent(anno));\n };\n\n onAnnotationDelete = async (id: string) => {\n await deleteAnnotation({ id });\n getDashboardQueryRunner().run({ dashboard: this.props.dashboard, range: this.timeSrv.timeRange() });\n this.state.context.eventBus.publish(new AnnotationChangeEvent({ id }));\n };\n\n onAnnotationUpdate = async (event: AnnotationEventUIModel) => {\n const isRegion = event.from !== event.to;\n const anno = {\n id: event.id,\n dashboardUID: this.props.dashboard.uid,\n panelId: this.props.panel.id,\n isRegion,\n time: event.from,\n timeEnd: isRegion ? event.to : 0,\n tags: event.tags,\n text: event.description,\n };\n await updateAnnotation(anno);\n\n getDashboardQueryRunner().run({ dashboard: this.props.dashboard, range: this.timeSrv.timeRange() });\n this.state.context.eventBus.publish(new AnnotationChangeEvent(anno));\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 (\n loadingState === LoadingState.Done ||\n loadingState === LoadingState.Streaming ||\n loadingState === LoadingState.Error ||\n pluginMeta.skipDataQuery\n );\n }\n\n skipFirstRender(loadingState: LoadingState) {\n const { isFirstLoad } = this.state;\n return (\n this.wantsQueryExecution &&\n isFirstLoad &&\n (loadingState === LoadingState.Loading || loadingState === LoadingState.NotStarted)\n );\n }\n\n onAddAdHocFilter = (filter: AdHocFilterItem) => {\n const { key, value, operator } = filter;\n\n // When the datasource is null/undefined (for a default datasource), we use getInstanceSettings\n // to find the real datasource ref for the default datasource.\n const datasourceInstance = getDatasourceSrv().getInstanceSettings(this.props.panel.datasource);\n const datasourceRef = datasourceInstance && getDataSourceRef(datasourceInstance);\n if (!datasourceRef) {\n return;\n }\n\n dispatch(applyFilterFromTable({ datasource: datasourceRef, key, operator, value }));\n };\n\n renderPanelContent(innerWidth: number, innerHeight: number) {\n const { panel, plugin, dashboard } = this.props;\n const { renderCounter, data } = this.state;\n const { state: loadingState } = data;\n\n // do not render component until we have first data\n if (this.skipFirstRender(loadingState)) {\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 = this.state.liveTime ?? data.timeRange ?? this.timeSrv.timeRange();\n const panelOptions = panel.getOptions();\n\n // Update the event filter (dashboard settings may have changed)\n // Yes this is called ever render for a function that is triggered on every mouse move\n this.eventFilter.onlyLocal = dashboard.graphTooltip === 0;\n\n return (\n <>\n \n \n {config.featureToggles.panelMonitoring && this.state.errorMessage === undefined && (\n \n )}\n \n \n );\n }\n\n setPanelAttention() {\n appEvents.publish(new SetPanelAttentionEvent({ panelId: this.props.panel.id }));\n }\n\n debouncedSetPanelAttention() {}\n\n render() {\n const { dashboard, panel, width, height, plugin } = this.props;\n const { errorMessage, data } = this.state;\n const { transparent } = panel;\n const panelChromeProps = getPanelChromeProps({ ...this.props, data });\n\n // Shift the hover menu down if it's on the top row so it doesn't get clipped by topnav\n const hoverHeaderOffset = (panel.gridPos?.y ?? 0) === 0 ? -16 : undefined;\n\n const menu = (\n
\n \n
\n );\n\n return (\n this.setPanelAttention()}\n onMouseEnter={() => this.setPanelAttention()}\n onMouseMove={() => this.debouncedSetPanelAttention()}\n >\n {(innerWidth, innerHeight) => (\n <>\n \n {({ error }) => {\n if (error) {\n return null;\n }\n return this.renderPanelContent(innerWidth, innerHeight);\n }}\n \n \n )}\n \n );\n }\n}\n","import { PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\n\nimport { StoreState } from 'app/types';\n\nimport { initPanelState } from '../../panel/state/actions';\nimport { setPanelInstanceState } from '../../panel/state/reducers';\nimport { DashboardModel, PanelModel } from '../state';\n\nimport { LazyLoader } from './LazyLoader';\nimport { PanelChromeAngular } from './PanelChromeAngular';\nimport { PanelStateWrapper } from './PanelStateWrapper';\n\nexport interface OwnProps {\n panel: PanelModel;\n stateKey: string;\n dashboard: DashboardModel;\n isEditing: boolean;\n isViewing: boolean;\n isDraggable?: boolean;\n width: number;\n height: number;\n lazy?: boolean;\n timezone?: string;\n hideMenu?: boolean;\n}\n\nconst mapStateToProps = (state: StoreState, props: OwnProps) => {\n const panelState = state.panels[props.stateKey];\n if (!panelState) {\n return { plugin: undefined };\n }\n\n return {\n plugin: panelState.plugin,\n instanceState: panelState.instanceState,\n };\n};\n\nconst mapDispatchToProps = {\n initPanelState,\n setPanelInstanceState,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type Props = OwnProps & ConnectedProps;\n\nexport class DashboardPanelUnconnected extends PureComponent {\n static defaultProps: Partial = {\n lazy: true,\n };\n\n componentDidMount() {\n this.props.panel.isInView = !this.props.lazy;\n if (!this.props.lazy) {\n this.onPanelLoad();\n }\n }\n\n onInstanceStateChange = (value: unknown) => {\n this.props.setPanelInstanceState({ key: this.props.stateKey, value });\n };\n\n onVisibilityChange = (v: boolean) => {\n this.props.panel.isInView = v;\n };\n\n onPanelLoad = () => {\n if (!this.props.plugin) {\n this.props.initPanelState(this.props.panel);\n }\n };\n\n renderPanel = ({ isInView }: { isInView: boolean }) => {\n const {\n dashboard,\n panel,\n isViewing,\n isEditing,\n width,\n height,\n plugin,\n timezone,\n hideMenu,\n isDraggable = true,\n } = this.props;\n\n if (!plugin) {\n return null;\n }\n\n if (plugin && plugin.angularPanelCtrl) {\n return (\n \n );\n }\n\n return (\n \n );\n };\n\n render() {\n const { width, height, lazy } = this.props;\n\n return lazy ? (\n \n {this.renderPanel}\n \n ) : (\n this.renderPanel({ isInView: true })\n );\n }\n}\n\nexport const DashboardPanel = connector(DashboardPanelUnconnected);\n","import {\n applyFieldOverrides,\n arrayToDataFrame,\n getDefaultTimeRange,\n getProcessedDataFrames,\n LoadingState,\n PanelData,\n} from '@grafana/data';\nimport { config } from 'app/core/config';\n\nimport { SnapshotWorker } from '../../query/state/DashboardQueryRunner/SnapshotWorker';\nimport { getTimeSrv } from '../services/TimeSrv';\nimport { DashboardModel, PanelModel } from '../state';\n\nimport { applyPanelTimeOverrides } from './panel';\n\nexport function loadSnapshotData(panel: PanelModel, dashboard: DashboardModel): PanelData {\n const data = getProcessedDataFrames(panel.snapshotData);\n const worker = new SnapshotWorker();\n const options = { dashboard, range: getDefaultTimeRange() };\n const annotationEvents = worker.canWork(options) ? worker.getAnnotationsInSnapshot(dashboard, panel.id) : [];\n const annotations = [arrayToDataFrame(annotationEvents)];\n const timeData = applyPanelTimeOverrides(panel, getTimeSrv().timeRange());\n\n return {\n timeRange: timeData.timeRange,\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.theme2,\n timeZone: dashboard.getTimezone(),\n }),\n structureRev: 1,\n annotations,\n };\n}\n"],"names":["LazyLoader","children","width","height","onLoad","onChange","id","loaded","setLoaded","isInView","setIsInView","wrapperRef","useEffectOnce","entry","wrapperEl","callbacks","c","entries","PanelLinks","panelLinks","onShowPanelLinks","styles","getStyles","getLinksContent","interpolatedLinks","Menu","link","idx","linkModel","PanelChrome","Icon","Dropdown","ToolbarButton","theme","PanelHeaderTitleItems","props","alertState","data","panelId","angularNotice","alertStateItem","Tooltip","timeshift","message","pluginType","angularNoticeTooltip","PanelHeaderNotices","getPanelChromeProps","hasOverlayHeader","onShowPanelDescription","descriptionMarkdown","linkSupplier","panelLink","args","onOpenInspector","e","tab","onOpenErrorInspect","onCancelQuery","padding","isAngularDatasource","isAngularPanel","showAngularNotice","titleItems","v","description","dragClass","title","PanelHeaderMenu","items","renderItems","item","getPanelMenu","dashboard","panel","extensions","angularComponent","onViewPanel","event","onEditPanel","onSharePanel","onAddLibraryPanel","onUnlinkLibraryPanel","onInspectPanel","onDuplicatePanel","onCopyPanel","onRemovePanel","onNavigateToExplore","openInNewWindow","url","config","store","onToggleLegend","menu","inspectMenu","createAlert","formValues","err","ruleFormUrl","onCreateAlert","subMenu","canEdit","isCreateAlertMenuOptionAvailable","scope","panelCtrl","angularMenuItems","reactItem","PanelHeaderMenuProvider","loadingState","setItems","state","context","createExtensionContext","links","usePluginLinks","PanelHeaderMenuWrapper","style","PanelChromeAngularUnconnected","Subscription","queryRunner","errorMessage","error","prevProps","prevState","plugin","headerHeight","chromePadding","setPanelAngularComponent","loader","template","transparent","panelChromeProps","hoverHeaderOffset","element","mapStateToProps","mapDispatchToProps","PanelChromeAngular","changeSeriesColorConfigFactory","label","color","fieldConfig","overrides","currentIndex","override","createOverride","overridesCopy","existing","propertyIndex","p","createProperty","propertiesCopy","PanelLogEvents","FIELD_CONFIG_OVERRIDES_KEY","FIELD_CONFIG_CUSTOM_KEY","PanelLoadTimeMonitor","startLoadTime","PanelOptionsLogger","initialPanelOptions","initialFieldConfig","panelLogInfo","latestPanelOptions","latestFieldConfig","eventName","newKey","newVal","oldVal","logObj","panelOptions","oldPanelOptions","oldPanelOptionsUnknown","key","value","newValue","oldValue","oldFieldConfig","oldOverridesStr","newOverridesStr","oldDefaults","oldCustom","DEFAULT_PLUGIN_ERROR","PanelStateWrapper","frames","mode","sortKey","legendOptions","sortDesc","sortBy","timeData","stateUpdate","options","isRegion","anno","timeRange","filter","operator","datasourceInstance","datasourceRef","eventBus","panelInfo","loadSnapshotData","liveTimer","liveTime","delta","app","isFirstLoad","errors","frame","pluginMeta","innerWidth","innerHeight","renderCounter","profiler","PanelComponent","PanelContext","ErrorBoundary","panelState","connector","DashboardPanelUnconnected","isViewing","isEditing","timezone","hideMenu","isDraggable","lazy","DashboardPanel","worker","annotationEvents","annotations"],"sourceRoot":""}