{"version":3,"file":"7362.acb44db65e8b744c275b.js","mappings":"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","sources":["webpack://grafana/./public/app/features/dashboard/dashgrid/LazyLoader.tsx","webpack://grafana/./public/app/routes/utils.ts","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelLinks.tsx","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderNotice.tsx","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderNotices.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/PanelHeaderLoadingIndicator.tsx","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderMenuTrigger.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/PanelHeader/PanelHeader.tsx","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelChromeAngular.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/overrides/colorSeriesConfigFactory.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/dashgrid/PanelHeader/PanelHeaderCorner.tsx","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderMenuItem.tsx","webpack://grafana/./public/app/features/dashboard/state/analyticsProcessor.ts","webpack://grafana/./public/app/features/dashboard/state/initDashboard.ts","webpack://grafana/./public/app/features/dashboard/utils/loadSnapshotData.ts","webpack://grafana/./public/app/features/inspector/types.ts","webpack://grafana/./public/app/features/panel/panellinks/linkSuppliers.ts","webpack://grafana/./public/app/features/panel/state/selectors.ts","webpack://grafana/./public/app/plugins/datasource/grafana/utils.ts"],"sourcesContent":["import React, { useRef, useState } from 'react';\nimport { useEffectOnce } from 'react-use';\n\nimport { useUniqueId } from 'app/plugins/datasource/influxdb/components/useUniqueId';\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 = useUniqueId();\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\nLazyLoader.callbacks = {} as Record void>;\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 { NavLinkDTO } from '@grafana/data';\n\nexport function isSoloRoute(path: string): boolean {\n return /(d-solo|dashboard-solo)/.test(path?.toLowerCase());\n}\n\nexport function pluginHasRootPage(pluginId: string, navTree: NavLinkDTO[]): boolean {\n return Boolean(\n navTree\n .find((navLink) => navLink.id === 'apps')\n ?.children?.find((app) => app.id === `plugin-page-${pluginId}`)\n ?.children?.some((page) => page.url?.endsWith(`/a/${pluginId}`))\n );\n}\n","import { css } from '@emotion/css';\nimport React from 'react';\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.borderRadius()}`,\n cursor: 'context-menu',\n }),\n };\n};\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2, QueryResultMetaNotice } from '@grafana/data';\nimport { Icon, ToolbarButton, Tooltip, useStyles2 } from '@grafana/ui';\nimport { getFocusStyles, getMouseFocusStyles } from '@grafana/ui/src/themes/mixins';\n\ninterface Props {\n notice: QueryResultMetaNotice;\n onClick: (e: React.SyntheticEvent, tab: string) => void;\n}\n\nexport const PanelHeaderNotice = ({ notice, onClick }: Props) => {\n const styles = useStyles2(getStyles);\n\n const iconName =\n notice.severity === 'error' || notice.severity === 'warning' ? 'exclamation-triangle' : 'file-landscape-alt';\n\n if (notice.inspect && onClick) {\n return (\n onClick(e, notice.inspect!)}\n />\n );\n }\n\n if (notice.link) {\n return (\n \n \n \n );\n }\n\n return (\n \n \n \n \n \n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n notice: css({\n background: 'inherit',\n border: 'none',\n borderRadius: theme.shape.borderRadius(),\n }),\n iconTooltip: css({\n color: `${theme.colors.text.secondary}`,\n backgroundColor: 'inherit',\n cursor: 'auto',\n border: 'none',\n borderRadius: `${theme.shape.borderRadius()}`,\n padding: `${theme.spacing(0, 1)}`,\n height: ` ${theme.spacing(theme.components.height.md)}`,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n\n '&:focus, &:focus-visible': {\n ...getFocusStyles(theme),\n zIndex: 1,\n },\n '&: focus:not(:focus-visible)': getMouseFocusStyles(theme),\n\n '&:hover ': {\n boxShadow: `${theme.shadows.z1}`,\n color: `${theme.colors.text.primary}`,\n background: `${theme.colors.background.secondary}`,\n },\n }),\n});\n","import React, { useCallback } from 'react';\n\nimport { DataFrame, QueryResultMetaNotice } from '@grafana/data';\nimport { locationService } from '@grafana/runtime';\n\nimport { PanelHeaderNotice } from './PanelHeaderNotice';\n\ninterface Props {\n panelId: number;\n frames: DataFrame[];\n}\n\nexport const PanelHeaderNotices = ({ frames, panelId }: Props) => {\n const openInspect = useCallback(\n (e: React.SyntheticEvent, tab: string) => {\n e.stopPropagation();\n locationService.partial({ inspect: panelId, inspectTab: tab });\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 { css, cx } from '@emotion/css';\nimport React from 'react';\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 Props {\n alertState?: string;\n data: PanelData;\n panelId: number;\n onShowPanelLinks?: () => Array>;\n panelLinks?: DataLink[];\n}\n\nexport function PanelHeaderTitleItems(props: Props) {\n const { alertState, data, panelId, onShowPanelLinks, panelLinks } = 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 return (\n <>\n {panelLinks && panelLinks.length > 0 && onShowPanelLinks && (\n \n )}\n\n {}\n {timeshift}\n {alertState && alertStateItem}\n \n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n ok: css({\n color: theme.colors.success.text,\n }),\n pending: css({\n color: theme.colors.warning.text,\n }),\n alerting: css({\n color: theme.colors.error.text,\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 };\n};\n","import React from 'react';\n\nimport { LinkModel, PanelData, PanelPlugin, renderMarkdown } from '@grafana/data';\nimport { getTemplateSrv, locationService, reportInteraction } from '@grafana/runtime';\nimport { PanelPadding } from '@grafana/ui';\nimport { InspectTab } from 'app/features/inspector/types';\nimport { getPanelLinksSupplier } from 'app/features/panel/panellinks/linkSuppliers';\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 let descriptionInteractionReported = false;\n\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 if (!descriptionInteractionReported) {\n // Description rendering function can be called multiple times due to re-renders but we want to report the interaction once.\n reportInteraction('dashboards_panelheader_description_displayed');\n descriptionInteractionReported = true;\n }\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 reportInteraction('dashboards_panelheader_datalink_clicked', { 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 reportInteraction('dashboards_panelheader_statusmessage_clicked');\n };\n\n const onCancelQuery = () => {\n props.panel.getQueryRunner().cancelQuery();\n reportInteraction('dashboards_panelheader_cancelquery_clicked', { 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 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 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 const onOpenMenu = () => {\n reportInteraction('dashboards_panelheader_menu', { item: 'menu' });\n };\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 onOpenMenu,\n };\n}\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2, LoadingState } from '@grafana/data';\nimport { Icon, Tooltip, useStyles2 } from '@grafana/ui';\n\ninterface Props {\n state: LoadingState;\n onClick: () => void;\n}\n\nexport const PanelHeaderLoadingIndicator = ({ state, onClick }: Props) => {\n const styles = useStyles2(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: GrafanaTheme2) {\n return {\n streamIndicator: css`\n width: 10px;\n height: 10px;\n background: ${theme.colors.text.disabled};\n box-shadow: 0 0 2px ${theme.colors.text.disabled};\n border-radius: 50%;\n position: relative;\n top: 6px;\n right: 1px;\n `,\n };\n}\n","import React, { HTMLAttributes, MouseEvent, ReactElement, useCallback, useRef, useState } from 'react';\n\nimport { CartesianCoords2D } from '@grafana/data';\n\ninterface PanelHeaderMenuTriggerApi {\n panelMenuOpen: boolean;\n closeMenu: () => void;\n}\n\ninterface Props extends Omit, 'children'> {\n children: (props: PanelHeaderMenuTriggerApi) => ReactElement;\n onOpenMenu?: () => void;\n}\n\nexport function PanelHeaderMenuTrigger({ children, onOpenMenu, ...divProps }: Props) {\n const clickCoordinates = useRef({ x: 0, y: 0 });\n const [panelMenuOpen, setPanelMenuOpen] = useState(false);\n\n const onMenuToggle = useCallback(\n (event: MouseEvent) => {\n if (!isClick(clickCoordinates.current, eventToClickCoordinates(event))) {\n return;\n }\n\n setPanelMenuOpen(!panelMenuOpen);\n if (panelMenuOpen) {\n onOpenMenu?.();\n }\n },\n [panelMenuOpen, setPanelMenuOpen, onOpenMenu]\n );\n\n const onMouseDown = useCallback((event: MouseEvent) => {\n clickCoordinates.current = eventToClickCoordinates(event);\n }, []);\n\n return (\n
\n {children({ panelMenuOpen, closeMenu: () => setPanelMenuOpen(false) })}\n
\n );\n}\n\nfunction isClick(current: CartesianCoords2D, clicked: CartesianCoords2D, deadZone = 3.5): boolean {\n // A \"deadzone\" radius is added so that if the cursor is moved within this radius\n // between mousedown and mouseup, it's still considered a click and not a drag.\n const clickDistance = Math.sqrt((current.x - clicked.x) ** 2 + (current.y - clicked.y) ** 2);\n return clickDistance <= deadZone;\n}\n\nfunction eventToClickCoordinates(event: MouseEvent): CartesianCoords2D {\n return {\n x: event.clientX,\n y: event.clientY,\n };\n}\n","import classnames from 'classnames';\nimport React, { PureComponent } from 'react';\n\nimport { PanelMenuItem } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Menu } from '@grafana/ui';\n\nimport { PanelHeaderMenuItem } from './PanelHeaderMenuItem';\n\nexport interface Props {\n items: PanelMenuItem[];\n style?: React.CSSProperties;\n itemsClassName?: string;\n className?: string;\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 (\n
\n {this.renderItems(this.props.items)}\n
\n );\n }\n}\n\nexport function PanelHeaderMenuNew({ items }: Props) {\n const renderItems = (items: PanelMenuItem[]) => {\n return items.map((item) =>\n item.type === 'divider' ? (\n \n ) : (\n \n )\n );\n };\n\n return {renderItems(items)};\n}\n","import { PanelMenuItem, PluginExtensionPoints, type PluginExtensionPanelContext } from '@grafana/data';\nimport {\n isPluginExtensionLink,\n AngularComponent,\n getDataSourceSrv,\n getPluginExtensions,\n locationService,\n reportInteraction,\n} from '@grafana/runtime';\nimport { PanelCtrl } from 'app/angular/panel/panel_ctrl';\nimport config from 'app/core/config';\nimport { t } from 'app/core/internationalization';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { getExploreUrl } from 'app/core/utils/explore';\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 { SHARED_DASHBOARD_QUERY } from 'app/plugins/datasource/dashboard';\nimport { store } from 'app/store/store';\n\nimport { navigateToExplore } from '../../explore/state/main';\nimport { getTimeSrv } from '../services/TimeSrv';\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 locationService.partial({\n viewPanel: panel.id,\n });\n reportInteraction('dashboards_panelheader_menu', { item: 'view' });\n };\n\n const onEditPanel = (event: React.MouseEvent) => {\n event.preventDefault();\n locationService.partial({\n editPanel: panel.id,\n });\n\n reportInteraction('dashboards_panelheader_menu', { item: 'edit' });\n };\n\n const onSharePanel = (event: React.MouseEvent) => {\n event.preventDefault();\n sharePanel(dashboard, panel);\n reportInteraction('dashboards_panelheader_menu', { item: 'share' });\n };\n\n const onAddLibraryPanel = (event: React.MouseEvent) => {\n event.preventDefault();\n addLibraryPanel(dashboard, panel);\n reportInteraction('dashboards_panelheader_menu', { item: 'createLibraryPanel' });\n };\n\n const onUnlinkLibraryPanel = (event: React.MouseEvent) => {\n event.preventDefault();\n unlinkLibraryPanel(panel);\n reportInteraction('dashboards_panelheader_menu', { item: 'unlinkLibraryPanel' });\n };\n\n const onInspectPanel = (tab?: InspectTab) => {\n locationService.partial({\n inspect: panel.id,\n inspectTab: tab,\n });\n reportInteraction('dashboards_panelheader_menu', { item: 'inspect', tab: tab ?? InspectTab.Data });\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 reportInteraction('dashboards_panelheader_menu', { item: 'duplicate' });\n };\n\n const onCopyPanel = (event: React.MouseEvent) => {\n event.preventDefault();\n copyPanel(panel);\n reportInteraction('dashboards_panelheader_menu', { item: 'copy' });\n };\n\n const onRemovePanel = (event: React.MouseEvent) => {\n event.preventDefault();\n removePanel(dashboard, panel, true);\n reportInteraction('dashboards_panelheader_menu', { item: 'remove' });\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 reportInteraction('dashboards_panelheader_menu', { item: 'explore' });\n };\n\n const onToggleLegend = (event: React.MouseEvent) => {\n event.preventDefault();\n toggleLegend(panel);\n reportInteraction('dashboards_panelheader_menu', { item: 'toggleLegend' });\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: '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 onClick: (e: React.MouseEvent) => {\n const currentTarget = e.currentTarget;\n const target = e.target as HTMLElement;\n const closestMenuItem = target.closest('[role=\"menuitem\"]');\n\n if (target === currentTarget || closestMenuItem === currentTarget) {\n onInspectPanel();\n }\n },\n shortcut: 'i',\n subMenu: inspectMenu,\n });\n\n const subMenu: PanelMenuItem[] = [];\n const canEdit = dashboard.canEditPanel(panel);\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 // 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 }\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 (subMenu.length) {\n menu.push({\n type: 'submenu',\n text: t('panel.header-menu.more', `More...`),\n iconClassName: 'cube',\n subMenu,\n onClick: onMore,\n });\n }\n\n const { extensions } = getPluginExtensions({\n extensionPointId: PluginExtensionPoints.DashboardPanelMenu,\n context: createExtensionContext(panel, dashboard),\n });\n\n if (extensions.length > 0 && !panel.isEditing) {\n const extensionsMenu: PanelMenuItem[] = [];\n\n for (const extension of extensions) {\n if (isPluginExtensionLink(extension)) {\n extensionsMenu.push({\n text: truncateTitle(extension.title, 25),\n href: extension.path,\n onClick: extension.onClick,\n });\n continue;\n }\n }\n\n menu.push({\n text: 'Extensions',\n iconClassName: 'plug',\n type: 'submenu',\n subMenu: extensionsMenu,\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\nfunction truncateTitle(title: string, length: number): string {\n if (title.length < length) {\n return title;\n }\n const part = title.slice(0, length - 3);\n return `${part.trimEnd()}...`;\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: dashboard.timezone,\n dashboard: {\n uid: dashboard.uid,\n title: dashboard.title,\n tags: Array.from(dashboard.tags),\n },\n targets: panel.targets,\n };\n}\n","import { ReactElement, useEffect, useState } from 'react';\n\nimport { LoadingState, PanelMenuItem } from '@grafana/data';\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\n useEffect(() => {\n setItems(getPanelMenu(dashboard, panel, angularComponent));\n }, [dashboard, panel, angularComponent, loadingState, setItems]);\n\n return children({ items });\n}\n","import React from 'react';\n\nimport { LoadingState } from '@grafana/data';\n\nimport { DashboardModel, PanelModel } from '../../state';\n\nimport { PanelHeaderMenu, PanelHeaderMenuNew } 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({\n panel,\n dashboard,\n loadingState,\n style,\n menuItemsClassName,\n menuWrapperClassName,\n}: Props) {\n return (\n \n {({ items }) => (\n \n )}\n \n );\n}\n\nexport function PanelHeaderMenuWrapperNew({ style, panel, dashboard, loadingState }: Props) {\n return (\n \n {({ items }) => }\n \n );\n}\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { DataLink, GrafanaTheme2, PanelData } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { reportInteraction } from '@grafana/runtime';\nimport { Icon, useStyles2, ClickOutsideWrapper } from '@grafana/ui';\nimport { DashboardModel } from 'app/features/dashboard/state/DashboardModel';\nimport { PanelModel } from 'app/features/dashboard/state/PanelModel';\nimport { getPanelLinksSupplier } from 'app/features/panel/panellinks/linkSuppliers';\n\nimport PanelHeaderCorner from './PanelHeaderCorner';\nimport { PanelHeaderLoadingIndicator } from './PanelHeaderLoadingIndicator';\nimport { PanelHeaderMenuTrigger } from './PanelHeaderMenuTrigger';\nimport { PanelHeaderMenuWrapper } from './PanelHeaderMenuWrapper';\nimport { PanelHeaderNotices } from './PanelHeaderNotices';\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 function PanelHeader({ panel, error, isViewing, isEditing, data, alertState, dashboard }: Props) {\n const onCancelQuery = () => panel.getQueryRunner().cancelQuery();\n const title = panel.getDisplayTitle();\n const className = cx('panel-header', !(isViewing || isEditing) ? 'grid-drag-handle' : '');\n const styles = useStyles2(panelStyles);\n\n const onOpenMenu = () => {\n reportInteraction('dashboards_panelheader_menu', { item: 'menu' });\n };\n\n return (\n <>\n \n \n
\n \n {({ closeMenu, panelMenuOpen }) => {\n return (\n \n
\n \n {alertState ? (\n \n ) : null}\n

{title}

\n {!dashboard.meta.publicDashboardAccessToken && (\n
\n \n {panelMenuOpen ? : null}\n
\n )}\n {data.request && data.request.timeInfo && (\n \n {data.request.timeInfo}\n \n )}\n
\n
\n );\n }}\n
\n
\n \n );\n}\n\nconst panelStyles = (theme: GrafanaTheme2) => {\n return {\n titleText: css`\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n max-width: calc(100% - 38px);\n cursor: pointer;\n font-weight: ${theme.typography.fontWeightMedium};\n font-size: ${theme.typography.body.fontSize};\n margin: 0;\n\n &:hover {\n color: ${theme.colors.text.primary};\n }\n .panel-has-alert & {\n max-width: calc(100% - 54px);\n }\n `,\n };\n};\n","import classNames from 'classnames';\nimport React, { PureComponent } from 'react';\nimport { connect, MapDispatchToProps, MapStateToProps } from 'react-redux';\nimport { Subscription } from 'rxjs';\n\nimport { getDefaultTimeRange, LoadingState, PanelData, PanelPlugin } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { AngularComponent, getAngularLoader, locationService } 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 { isSoloRoute } from '../../../routes/utils';\nimport { getTimeSrv, TimeSrv } from '../services/TimeSrv';\nimport { DashboardModel, PanelModel } from '../state';\nimport { getPanelChromeProps } from '../utils/getPanelChromeProps';\n\nimport { PanelHeader } from './PanelHeader/PanelHeader';\nimport { PanelHeaderMenuWrapperNew } 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, isViewing, isEditing, plugin } = this.props;\n const { errorMessage, data } = this.state;\n const { transparent } = panel;\n const alertState = data.alertState?.state;\n\n const panelChromeProps = getPanelChromeProps({ ...this.props, data });\n\n const containerClassNames = classNames({\n 'panel-container': true,\n 'panel-container--absolute': isSoloRoute(locationService.getLocation().pathname),\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 if (config.featureToggles.newPanelChromeUI) {\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 } else {\n return (\n \n \n
\n
(this.element = element)} className=\"panel-height-helper\" />\n
\n
\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","import classNames from 'classnames';\nimport React, { 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 PluginContextProvider,\n TimeRange,\n toDataFrameDTO,\n toUtc,\n} from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { config, locationService, 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 { PANEL_BORDER } from 'app/core/constants';\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 { isSoloRoute } from '../../../routes/utils';\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 { PanelHeader } from './PanelHeader/PanelHeader';\nimport { PanelHeaderMenuWrapperNew } from './PanelHeader/PanelHeaderMenuWrapper';\nimport { seriesVisibilityConfigFactory } from './SeriesVisibilityConfigFactory';\nimport { liveTimer } from './liveTimer';\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: any) => void;\n timezone?: string;\n hideMenu?: boolean;\n}\n\nexport interface State {\n isFirstLoad: boolean;\n renderCounter: number;\n errorMessage?: string;\n refreshWhenInView: boolean;\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\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\n this.state = {\n isFirstLoad: true,\n renderCounter: 0,\n refreshWhenInView: false,\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\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: any) => {\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 } = 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 (this.state.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 (!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 if (this.state.refreshWhenInView) {\n this.setState({ refreshWhenInView: false });\n }\n panel.runAllPanelQueries({\n dashboardUID: dashboard.uid,\n dashboardTimezone: dashboard.getTimezone(),\n publicDashboardAccessToken: dashboard.meta.publicDashboardAccessToken,\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: any) => {\n this.props.panel.updateOptions(options);\n };\n\n onFieldConfigChange = (config: FieldConfigSource) => {\n this.props.panel.updateFieldConfig(config);\n };\n\n onPanelError = (error: Error) => {\n const errorMessage = error.message || DEFAULT_PLUGIN_ERROR;\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 loadingState === LoadingState.Done || loadingState === LoadingState.Error || pluginMeta.skipDataQuery;\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 \n \n );\n }\n\n renderPanel(width: number, height: number) {\n const { panel, plugin, dashboard } = this.props;\n const { renderCounter, data } = this.state;\n const { theme } = config;\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 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 // 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 const timeZone = this.props.timezone || this.props.dashboard.getTimezone();\n\n return (\n <>\n
\n \n \n \n \n \n
\n \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, isViewing, isEditing, width, height, plugin } = this.props;\n const { errorMessage, data } = this.state;\n const { transparent } = panel;\n\n const alertState = data.alertState?.state;\n const hasHoverHeader = this.hasOverlayHeader();\n\n const containerClassNames = classNames({\n 'panel-container': true,\n 'panel-container--absolute': isSoloRoute(locationService.getLocation().pathname),\n 'panel-container--transparent': transparent,\n 'panel-container--no-title': hasHoverHeader,\n [`panel-alert-state--${alertState}`]: alertState !== undefined,\n });\n\n const panelChromeProps = getPanelChromeProps({ ...this.props, data });\n\n if (config.featureToggles.newPanelChromeUI) {\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 {(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 } else {\n return (\n \n \n \n {({ error }) => {\n if (error) {\n return null;\n }\n return this.renderPanel(width, height);\n }}\n \n \n );\n }\n }\n}\n","import React, { 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: null };\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: any) => {\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 React, { Component } from 'react';\n\nimport { renderMarkdown, LinkModelSupplier, ScopedVars } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { locationService, getTemplateSrv } from '@grafana/runtime';\nimport { Tooltip, PopoverContent } from '@grafana/ui';\nimport { getTimeSrv, TimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { PanelModel } from 'app/features/dashboard/state/PanelModel';\nimport { InspectTab } from 'app/features/inspector/types';\n\nenum InfoMode {\n Error = 'Error',\n Info = 'Info',\n Links = 'Links',\n}\n\nexport interface 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 locationService.partial({\n inspect: this.props.panel.id,\n inspectTab: InspectTab.Error,\n });\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 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 { css } from '@emotion/css';\nimport React, { useState } from 'react';\n\nimport { PanelMenuItem, GrafanaTheme2 } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Icon, toIconName, useStyles2 } from '@grafana/ui';\n\ninterface Props {\n children?: React.ReactNode;\n}\n\nexport const PanelHeaderMenuItem = (props: Props & PanelMenuItem) => {\n const [ref, setRef] = useState(null);\n const isSubMenu = props.type === 'submenu';\n const isDivider = props.type === 'divider';\n const styles = useStyles2(getStyles);\n\n const icon = props.iconClassName ? toIconName(props.iconClassName) : undefined;\n\n return isDivider ? (\n
  • \n ) : (\n \n \n {icon && }\n \n {props.text}\n {isSubMenu && }\n \n\n {props.shortcut && (\n \n {props.shortcut}\n \n )}\n \n {props.children}\n
  • \n );\n};\n\nfunction getDropdownLocationCssClass(element: HTMLElement | null) {\n if (!element) {\n return 'invisible';\n }\n\n const wrapperPos = element.parentElement!.getBoundingClientRect();\n const pos = element.getBoundingClientRect();\n\n if (pos.width === 0) {\n return 'invisible';\n }\n\n if (wrapperPos.right + pos.width + 10 > window.innerWidth) {\n return 'pull-left';\n } else {\n return 'pull-right';\n }\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n menuIconClassName: css({\n marginRight: theme.spacing(1),\n 'a::after': {\n display: 'none',\n },\n }),\n shortcutIconClassName: css({\n position: 'absolute',\n top: '7px',\n right: theme.spacing(0.5),\n color: theme.colors.text.secondary,\n }),\n };\n}\n","import { reportMetaAnalytics, MetaAnalyticsEventName, DashboardViewEventPayload } from '@grafana/runtime';\n\nimport { DashboardModel } from './DashboardModel';\n\nexport function emitDashboardViewEvent(dashboard: DashboardModel) {\n const eventData: DashboardViewEventPayload = {\n /** @deprecated */\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","import { DataQuery, locationUtil, setWeekStart, DashboardLoadedEvent } from '@grafana/data';\nimport { config, isFetchError, locationService } from '@grafana/runtime';\nimport { notifyApp } from 'app/core/actions';\nimport appEvents from 'app/core/app_events';\nimport { createErrorNotification } from 'app/core/copy/appNotification';\nimport { backendSrv } from 'app/core/services/backend_srv';\nimport { KeybindingSrv } from 'app/core/services/keybindingSrv';\nimport store from 'app/core/store';\nimport { dashboardLoaderSrv } from 'app/features/dashboard/services/DashboardLoaderSrv';\nimport { DashboardSrv, getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport { getTimeSrv, TimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { getFolderByUid } from 'app/features/folders/state/actions';\nimport { dashboardWatcher } from 'app/features/live/dashboard/dashboardWatcher';\nimport { playlistSrv } from 'app/features/playlist/PlaylistSrv';\nimport { toStateKey } from 'app/features/variables/utils';\nimport {\n DashboardDTO,\n DashboardInitPhase,\n DashboardMeta,\n DashboardRoutes,\n StoreState,\n ThunkDispatch,\n ThunkResult,\n} from 'app/types';\n\nimport { createDashboardQueryRunner } from '../../query/state/DashboardQueryRunner/DashboardQueryRunner';\nimport { initVariablesTransaction } from '../../variables/state/actions';\nimport { getIfExistsLastKey } from '../../variables/state/selectors';\n\nimport { DashboardModel } from './DashboardModel';\nimport { PanelModel } from './PanelModel';\nimport { emitDashboardViewEvent } from './analyticsProcessor';\nimport { dashboardInitCompleted, dashboardInitFailed, dashboardInitFetching, dashboardInitServices } from './reducers';\n\nexport interface InitDashboardArgs {\n urlUid?: string;\n urlSlug?: string;\n urlType?: string;\n urlFolderUid?: string;\n panelType?: string;\n accessToken?: string;\n routeName?: string;\n fixUrl: boolean;\n keybindingSrv: KeybindingSrv;\n}\n\nasync function fetchDashboard(\n args: InitDashboardArgs,\n dispatch: ThunkDispatch,\n getState: () => StoreState\n): Promise {\n // When creating new or adding panels to a dashboard from explore we load it from local storage\n const model = store.getObject(DASHBOARD_FROM_LS_KEY);\n if (model) {\n removeDashboardToFetchFromLocalStorage();\n return model;\n }\n\n try {\n switch (args.routeName) {\n case DashboardRoutes.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 locationService.replace(newUrl);\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 DashboardRoutes.Public: {\n return await dashboardLoaderSrv.loadDashboard('public', args.urlSlug, args.accessToken);\n }\n case DashboardRoutes.Normal: {\n const dashDTO: DashboardDTO = await dashboardLoaderSrv.loadDashboard(args.urlType, args.urlSlug, args.urlUid);\n\n // only the folder API has information about ancestors\n // get parent folder (if it exists) and put it in the store\n // this will be used to populate the full breadcrumb trail\n if (config.featureToggles.nestedFolders && dashDTO.meta.folderUid) {\n await dispatch(getFolderByUid(dashDTO.meta.folderUid));\n }\n if (args.fixUrl && dashDTO.meta.url && !playlistSrv.isPlaying) {\n // check if the current url is correct (might be old slug)\n const dashboardUrl = locationUtil.stripBaseFromUrl(dashDTO.meta.url);\n const currentPath = locationService.getLocation().pathname;\n\n if (dashboardUrl !== currentPath) {\n // Spread current location to persist search params used for navigation\n locationService.replace({\n ...locationService.getLocation(),\n pathname: dashboardUrl,\n });\n console.log('not correct url correcting', dashboardUrl, currentPath);\n }\n }\n return dashDTO;\n }\n case DashboardRoutes.New: {\n return getNewDashboardModelData(args.urlFolderUid, args.panelType);\n }\n case DashboardRoutes.Path: {\n const path = args.urlSlug ?? '';\n return await dashboardLoaderSrv.loadDashboard(DashboardRoutes.Path, path, path);\n }\n default:\n throw { message: 'Unknown route ' + args.routeName };\n }\n } catch (err) {\n // Ignore cancelled errors\n if (isFetchError(err) && 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\nconst getQueriesByDatasource = (\n panels: PanelModel[],\n queries: { [datasourceId: string]: DataQuery[] } = {}\n): { [datasourceId: string]: DataQuery[] } => {\n panels.forEach((panel) => {\n if (panel.panels) {\n getQueriesByDatasource(panel.panels, queries);\n } else if (panel.targets) {\n panel.targets.forEach((target) => {\n if (target.datasource?.type) {\n if (queries[target.datasource.type]) {\n queries[target.datasource.type].push(target);\n } else {\n queries[target.datasource.type] = [target];\n }\n }\n });\n }\n });\n return queries;\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 // 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 const queryParams = locationService.getSearchObject();\n\n if (!queryParams.orgId) {\n // TODO this is currently not possible with the LocationService API\n locationService.partial({ orgId: storeState.user.orgId }, true);\n }\n\n // init services\n const timeSrv: TimeSrv = getTimeSrv();\n const dashboardSrv: DashboardSrv = getDashboardSrv();\n\n // legacy srv state, we need this value updated for built-in annotations\n dashboardSrv.setCurrent(dashboard);\n\n timeSrv.init(dashboard);\n\n const dashboardUid = toStateKey(args.urlUid ?? dashboard.uid);\n // template values service needs to initialize completely before the rest of the dashboard can load\n await dispatch(initVariablesTransaction(dashboardUid, dashboard));\n\n // DashboardQueryRunner needs to run after all variables have been resolved so that any annotation query including a variable\n // will be correctly resolved\n const runner = createDashboardQueryRunner({ dashboard, timeSrv });\n runner.run({ dashboard, range: timeSrv.timeRange() });\n\n if (getIfExistsLastKey(getState()) !== dashboardUid) {\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\n // handle auto fix experimental feature\n if (queryParams.autofitpanels) {\n dashboard.autoFitPanels(window.innerHeight, queryParams.kiosk);\n }\n\n args.keybindingSrv.setupDashboardBindings(dashboard);\n } catch (err) {\n if (err instanceof Error) {\n dispatch(notifyApp(createErrorNotification('Dashboard init failed', err)));\n }\n console.error(err);\n }\n\n // send open dashboard event\n if (args.routeName !== DashboardRoutes.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 // set week start\n if (dashboard.weekStart !== '') {\n setWeekStart(dashboard.weekStart);\n } else {\n setWeekStart(config.bootData.user.weekStart);\n }\n\n // Propagate an app-wide event about the dashboard being loaded\n appEvents.publish(\n new DashboardLoadedEvent({\n dashboardId: dashboard.uid,\n orgId: storeState.user.orgId,\n userId: storeState.user.user?.id,\n grafanaVersion: config.buildInfo.version,\n queries: getQueriesByDatasource(dashboard.panels),\n })\n );\n\n // yay we are done\n dispatch(dashboardInitCompleted(dashboard));\n };\n}\n\nexport function getNewDashboardModelData(\n urlFolderUid?: string,\n panelType?: string\n): { dashboard: any; meta: DashboardMeta } {\n const panels = config.featureToggles.emptyDashboardPage\n ? []\n : [\n {\n type: panelType ?? 'add-panel',\n gridPos: { x: 0, y: 0, w: 12, h: 9 },\n title: 'Panel Title',\n },\n ];\n\n const data = {\n meta: {\n canStar: false,\n canShare: false,\n canDelete: false,\n isNew: true,\n folderUid: '',\n },\n dashboard: {\n title: 'New dashboard',\n panels,\n },\n };\n\n if (urlFolderUid) {\n data.meta.folderUid = urlFolderUid;\n }\n\n return data;\n}\n\nconst DASHBOARD_FROM_LS_KEY = 'DASHBOARD_FROM_LS_KEY';\n\nexport function setDashboardToFetchFromLocalStorage(model: DashboardDTO) {\n store.setObject(DASHBOARD_FROM_LS_KEY, model);\n}\n\nexport function removeDashboardToFetchFromLocalStorage() {\n store.delete(DASHBOARD_FROM_LS_KEY);\n}\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 annotations,\n };\n}\n","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 Help = 'help', // get info required for support+debugging\n}\n","import {\n DataLink,\n DisplayValue,\n FieldDisplay,\n formattedValueToString,\n getFieldDisplayValuesProxy,\n getTimeField,\n InterpolateFunction,\n Labels,\n LinkModelSupplier,\n ScopedVar,\n ScopedVars,\n} from '@grafana/data';\nimport { PanelModel } from 'app/features/dashboard/state/PanelModel';\n\nimport { getLinkSrv } from './link_srv';\n\ninterface SeriesVars {\n name?: string;\n refId?: string;\n}\n\ninterface FieldVars {\n name: string;\n labels?: Labels;\n}\n\ninterface ValueVars {\n raw: any;\n numeric: number;\n text: string;\n time?: number;\n calc?: string;\n}\n\ninterface DataViewVars {\n name?: string;\n refId?: string;\n fields?: Record;\n}\n\ninterface DataLinkScopedVars extends ScopedVars {\n __series: ScopedVar;\n __field: ScopedVar;\n __value: ScopedVar;\n __data: ScopedVar;\n}\n\n/**\n * Link suppliers creates link models based on a link origin\n */\nexport const getFieldLinksSupplier = (value: FieldDisplay): LinkModelSupplier | undefined => {\n const links = value.field.links;\n if (!links || links.length === 0) {\n return undefined;\n }\n\n return {\n getLinks: (replaceVariables: InterpolateFunction) => {\n const scopedVars: Partial = {};\n\n if (value.view) {\n const { dataFrame } = value.view;\n\n scopedVars['__series'] = {\n value: {\n name: dataFrame.name,\n refId: dataFrame.refId,\n },\n text: 'Series',\n };\n\n const field = value.colIndex !== undefined ? dataFrame.fields[value.colIndex] : undefined;\n\n if (field) {\n scopedVars['__field'] = {\n value: {\n name: field.name,\n labels: field.labels,\n },\n text: 'Field',\n };\n\n if (value.rowIndex !== undefined && value.rowIndex >= 0) {\n const { timeField } = getTimeField(dataFrame);\n scopedVars['__value'] = {\n value: {\n raw: field.values[value.rowIndex],\n numeric: value.display.numeric,\n text: formattedValueToString(value.display),\n time: timeField ? timeField.values[value.rowIndex] : undefined,\n },\n text: 'Value',\n };\n }\n\n // Expose other values on the row\n if (value.view) {\n scopedVars['__data'] = {\n value: {\n name: dataFrame.name,\n refId: dataFrame.refId,\n fields: getFieldDisplayValuesProxy({\n frame: dataFrame,\n rowIndex: value.rowIndex!,\n }),\n },\n text: 'Data',\n };\n }\n } else {\n // calculation\n scopedVars['__value'] = {\n value: {\n raw: value.display.numeric,\n numeric: value.display.numeric,\n text: formattedValueToString(value.display),\n calc: value.name,\n },\n text: 'Value',\n };\n }\n } else {\n console.log('VALUE', value);\n }\n\n const replace: InterpolateFunction = (value: string, vars: ScopedVars | undefined, fmt?: string | Function) => {\n const finalVars: ScopedVars = {\n ...(scopedVars as ScopedVars),\n ...vars,\n };\n return replaceVariables(value, finalVars, fmt);\n };\n\n return links.map((link: DataLink) => {\n return getLinkSrv().getDataLinkUIModel(link, replace, value);\n });\n },\n };\n};\n\nexport const getPanelLinksSupplier = (panel: PanelModel): LinkModelSupplier | undefined => {\n const links = panel.links;\n\n if (!links || links.length === 0) {\n return undefined;\n }\n\n return {\n getLinks: () => {\n return links.map((link) => {\n return getLinkSrv().getDataLinkUIModel(link, panel.replaceVariables, panel);\n });\n },\n };\n};\n","import { PanelModel } from 'app/features/dashboard/state';\nimport { StoreState } from 'app/types';\n\nimport { PanelState } from './reducers';\n\nexport function getPanelStateForModel(state: StoreState, model: PanelModel): PanelState | undefined {\n return state.panels[model.key];\n}\n","import { DropEvent, FileRejection } from 'react-dropzone';\n\nimport { DataFrame, DataFrameJSON, dataFrameToJSON } from '@grafana/data';\nimport appEvents from 'app/core/app_events';\nimport { GRAFANA_DATASOURCE_NAME } from 'app/features/alerting/unified/utils/datasource';\nimport { PanelModel } from 'app/features/dashboard/state';\nimport * as DFImport from 'app/features/dataframe-import';\nimport { ShowConfirmModalEvent } from 'app/types/events';\n\nimport { defaultFileUploadQuery, GrafanaQuery, GrafanaQueryType } from './types';\n\n/**\n * Will show a confirm modal if the current panel does not have a snapshot query.\n * If the confirm modal is shown, and the user aborts the promise will resolve with a false value,\n * otherwise it will resolve with a true value.\n */\nexport function onUpdatePanelSnapshotData(panel: PanelModel, frames: DataFrame[]): Promise {\n return new Promise((resolve) => {\n if (panel.datasource?.uid === GRAFANA_DATASOURCE_NAME) {\n updateSnapshotData(frames, panel);\n resolve(true);\n return;\n }\n\n appEvents.publish(\n new ShowConfirmModalEvent({\n title: 'Change to panel embedded data',\n text: 'If you want to change the data shown in this panel Grafana will need to remove the panels current query and replace it with a snapshot of the current data. This enables you to edit the data.',\n yesText: 'Continue',\n icon: 'pen',\n onConfirm: () => {\n updateSnapshotData(frames, panel);\n resolve(true);\n },\n onDismiss: () => {\n resolve(false);\n },\n })\n );\n });\n}\n\nfunction updateSnapshotData(frames: DataFrame[], panel: PanelModel) {\n const snapshot: DataFrameJSON[] = frames.map((f) => dataFrameToJSON(f));\n\n const query: GrafanaQuery = {\n refId: 'A',\n queryType: GrafanaQueryType.Snapshot,\n snapshot,\n datasource: { uid: GRAFANA_DATASOURCE_NAME },\n };\n\n panel.updateQueries({\n dataSource: { uid: GRAFANA_DATASOURCE_NAME },\n queries: [query],\n });\n\n panel.refresh();\n}\n\nexport function getFileDropToQueryHandler(\n onFileLoaded: (query: GrafanaQuery, fileRejections: FileRejection[]) => void\n) {\n return (acceptedFiles: File[], fileRejections: FileRejection[], event: DropEvent) => {\n DFImport.filesToDataframes(acceptedFiles).subscribe(async (next) => {\n const snapshot: DataFrameJSON[] = [];\n next.dataFrames.forEach((df: DataFrame) => {\n const dataframeJson = dataFrameToJSON(df);\n snapshot.push(dataframeJson);\n });\n onFileLoaded({ ...defaultFileUploadQuery, ...{ snapshot: snapshot, file: next.file } }, fileRejections);\n });\n };\n}\n"],"names":["LazyLoader","children","width","height","onLoad","onChange","id","useUniqueId","loaded","setLoaded","isInView","setIsInView","wrapperRef","useEffectOnce","entry","wrapperEl","c","entries","isSoloRoute","path","pluginHasRootPage","pluginId","navTree","navLink","app","page","PanelLinks","panelLinks","onShowPanelLinks","styles","getStyles","getLinksContent","interpolatedLinks","Menu","link","idx","linkModel","PanelChrome","Icon","Dropdown","ToolbarButton","theme","PanelHeaderNotice","notice","onClick","iconName","e","Tooltip","PanelHeaderNotices","frames","panelId","openInspect","tab","notices","frame","PanelHeaderTitleItems","props","alertState","data","alertStateItem","timeshift","getPanelChromeProps","descriptionInteractionReported","hasOverlayHeader","onShowPanelDescription","descriptionMarkdown","interpolatedDescription","linkSupplier","panelLink","args","onOpenInspector","onOpenErrorInspect","onCancelQuery","padding","titleItems","v","description","dragClass","title","PanelHeaderLoadingIndicator","state","PanelHeaderMenuTrigger","onOpenMenu","divProps","clickCoordinates","panelMenuOpen","setPanelMenuOpen","onMenuToggle","event","isClick","eventToClickCoordinates","onMouseDown","current","clicked","deadZone","PanelHeaderMenu","menu","isSubMenu","menuItem","PanelHeaderMenuItem","PanelHeaderMenuNew","items","renderItems","item","selectors","getPanelMenu","dashboard","panel","angularComponent","onViewPanel","onEditPanel","onSharePanel","onAddLibraryPanel","onUnlinkLibraryPanel","onInspectPanel","onMore","onDuplicatePanel","onCopyPanel","onRemovePanel","onNavigateToExplore","openInNewWindow","url","config","store","onToggleLegend","inspectMenu","currentTarget","target","closestMenuItem","subMenu","canEdit","scope","panelCtrl","angularMenuItems","reactItem","extensions","getPluginExtensions","createExtensionContext","extensionsMenu","extension","truncateTitle","length","PanelHeaderMenuProvider","loadingState","setItems","PanelHeaderMenuWrapper","style","menuItemsClassName","menuWrapperClassName","PanelHeaderMenuWrapperNew","PanelHeader","error","isViewing","isEditing","className","panelStyles","PanelHeaderCorner","closeMenu","ClickOutsideWrapper","PanelChromeAngularUnconnected","Subscription","queryRunner","errorMessage","prevProps","prevState","plugin","headerHeight","chromePadding","setPanelAngularComponent","loader","template","transparent","panelChromeProps","containerClassNames","panelContentClassNames","hoverHeaderOffset","element","mapStateToProps","mapDispatchToProps","PanelChromeAngular","changeSeriesColorConfigFactory","label","color","fieldConfig","overrides","currentIndex","override","createOverride","overridesCopy","existing","propertyIndex","p","createProperty","propertiesCopy","DEFAULT_PLUGIN_ERROR","PanelStateWrapper","value","mode","sortKey","legendOptions","sortDesc","sortBy","timeData","stateUpdate","options","isRegion","anno","timeRange","filter","key","operator","datasourceInstance","datasourceRef","eventBus","loadSnapshotData","liveTimer","liveTime","delta","context","isFirstLoad","errors","pluginMeta","innerWidth","innerHeight","renderCounter","profiler","PanelComponent","panelOptions","PanelContext","panelWidth","innerPanelHeight","timeZone","PluginContextProvider","hasHoverHeader","ErrorBoundary","panelState","connector","DashboardPanelUnconnected","timezone","hideMenu","isDraggable","lazy","DashboardPanel","InfoMode","markdown","interpolatedMarkdown","markedInterpolatedMarkdown","links","infoMode","content","ariaLabel","ref","setRef","isDivider","icon","getDropdownLocationCssClass","wrapperPos","pos","emitDashboardViewEvent","eventData","fetchDashboard","dispatch","getState","model","DASHBOARD_FROM_LS_KEY","removeDashboardToFetchFromLocalStorage","dashDTO","newUrl","dashboardUrl","currentPath","getNewDashboardModelData","err","getQueriesByDatasource","panels","queries","initDashboard","DashboardModel","storeState","queryParams","timeSrv","dashboardUid","dashboardWatcher","urlFolderUid","panelType","setDashboardToFetchFromLocalStorage","worker","annotationEvents","annotations","InspectTab","getFieldLinksSupplier","replaceVariables","scopedVars","dataFrame","field","timeField","replace","vars","fmt","finalVars","getPanelLinksSupplier","getPanelStateForModel","onUpdatePanelSnapshotData","resolve","updateSnapshotData","snapshot","f","query","getFileDropToQueryHandler","onFileLoaded","acceptedFiles","fileRejections","next","df","dataframeJson"],"sourceRoot":""}