{"version":3,"file":"97.13ed9b57ad4259fefbdc.js","mappings":"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","sources":["webpack://grafana/./public/app/features/dashboard/dashgrid/LazyLoader.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/overrides/colorSeriesConfigFactory.ts","webpack://grafana/./public/app/routes/utils.ts","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/dashgrid/PanelHeader/PanelHeaderMenuProvider.tsx","webpack://grafana/./public/app/features/dashboard/utils/getPanelMenu.ts","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderMenuWrapper.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/PanelHeader.tsx","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelChrome.tsx","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelChromeAngular.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/SeriesVisibilityConfigFactory.ts","webpack://grafana/./public/app/features/dashboard/state/initDashboard.ts","webpack://grafana/./public/app/features/dashboard/state/analyticsProcessor.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"],"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<HTMLDivElement>(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    <div id={id} ref={wrapperRef} style={{ width, height }}>\n      {loaded && (typeof children === 'function' ? children({ isInView }) : children)}\n    </div>\n  );\n}\n\nLazyLoader.callbacks = {} as Record<string, (e: IntersectionObserverEntry) => 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      LazyLoader.callbacks[entry.target.id](entry);\n    }\n  },\n  { rootMargin: '100px' }\n);\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 function isSoloRoute(path: string): boolean {\n  return /(d-solo|dashboard-solo)/.test(path?.toLowerCase());\n}\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme, LoadingState } from '@grafana/data';\nimport { Icon, Tooltip, useStyles } from '@grafana/ui';\n\ninterface Props {\n  state: LoadingState;\n  onClick: () => void;\n}\n\nexport const PanelHeaderLoadingIndicator: FC<Props> = ({ state, onClick }) => {\n  const styles = useStyles(getStyles);\n\n  if (state === LoadingState.Loading) {\n    return (\n      <div className=\"panel-loading\" onClick={onClick}>\n        <Tooltip content=\"Cancel query\">\n          <Icon className=\"panel-loading__spinner spin-clockwise\" name=\"sync\" />\n        </Tooltip>\n      </div>\n    );\n  }\n\n  if (state === LoadingState.Streaming) {\n    return (\n      <div className=\"panel-loading\" onClick={onClick}>\n        <div title=\"Streaming (click to stop)\" className={styles.streamIndicator} />\n      </div>\n    );\n  }\n\n  return null;\n};\n\nfunction getStyles(theme: GrafanaTheme) {\n  return {\n    streamIndicator: css`\n      width: 10px;\n      height: 10px;\n      background: ${theme.colors.textFaint};\n      box-shadow: 0 0 2px ${theme.colors.textFaint};\n      border-radius: 50%;\n      position: relative;\n      top: 6px;\n      right: 1px;\n    `,\n  };\n}\n","import React, { FC, HTMLAttributes, MouseEvent, ReactElement, useCallback, useState } from 'react';\n\nimport { CartesianCoords2D } from '@grafana/data';\n\ninterface PanelHeaderMenuTriggerApi {\n  panelMenuOpen: boolean;\n  closeMenu: () => void;\n}\n\ninterface Props extends HTMLAttributes<HTMLDivElement> {\n  children: (props: PanelHeaderMenuTriggerApi) => ReactElement;\n}\n\nexport const PanelHeaderMenuTrigger: FC<Props> = ({ children, ...divProps }) => {\n  const [clickCoordinates, setClickCoordinates] = useState<CartesianCoords2D>({ x: 0, y: 0 });\n  const [panelMenuOpen, setPanelMenuOpen] = useState<boolean>(false);\n\n  const onMenuToggle = useCallback(\n    (event: MouseEvent<HTMLDivElement>) => {\n      if (!isClick(clickCoordinates, eventToClickCoordinates(event))) {\n        return;\n      }\n\n      setPanelMenuOpen(!panelMenuOpen);\n    },\n    [clickCoordinates, panelMenuOpen, setPanelMenuOpen]\n  );\n\n  const onMouseDown = useCallback(\n    (event: MouseEvent<HTMLDivElement>) => {\n      setClickCoordinates(eventToClickCoordinates(event));\n    },\n    [setClickCoordinates]\n  );\n\n  return (\n    <header {...divProps} className=\"panel-title-container\" onClick={onMenuToggle} onMouseDown={onMouseDown}>\n      {children({ panelMenuOpen, closeMenu: () => setPanelMenuOpen(false) })}\n    </header>\n  );\n};\n\nfunction isClick(current: CartesianCoords2D, clicked: CartesianCoords2D): boolean {\n  return clicked.x === current.x && clicked.y === current.y;\n}\n\nfunction eventToClickCoordinates(event: MouseEvent<HTMLDivElement>): CartesianCoords2D {\n  return {\n    x: Math.floor(event.clientX),\n    y: Math.floor(event.clientY),\n  };\n}\n","import React, { PureComponent } from 'react';\n\nimport { PanelMenuItem } from '@grafana/data';\n\nimport { PanelHeaderMenuItem } from './PanelHeaderMenuItem';\n\nexport interface Props {\n  items: PanelMenuItem[];\n}\n\nexport class PanelHeaderMenu extends PureComponent<Props> {\n  renderItems = (menu: PanelMenuItem[], isSubMenu = false) => {\n    return (\n      <ul className=\"dropdown-menu dropdown-menu--menu panel-menu\" role={isSubMenu ? '' : 'menu'}>\n        {menu.map((menuItem, idx: number) => {\n          return (\n            <PanelHeaderMenuItem\n              key={`${menuItem.text}${idx}`}\n              type={menuItem.type}\n              text={menuItem.text}\n              iconClassName={menuItem.iconClassName}\n              onClick={menuItem.onClick}\n              shortcut={menuItem.shortcut}\n            >\n              {menuItem.subMenu && this.renderItems(menuItem.subMenu, true)}\n            </PanelHeaderMenuItem>\n          );\n        })}\n      </ul>\n    );\n  };\n\n  render() {\n    return <div className=\"panel-menu-container dropdown open\">{this.renderItems(this.props.items)}</div>;\n  }\n}\n","import { FC, ReactElement, useEffect, useState } from 'react';\nimport { useSelector } from 'react-redux';\n\nimport { PanelMenuItem } from '@grafana/data';\nimport { getPanelStateForModel } from 'app/features/panel/state/selectors';\n\nimport { StoreState } from '../../../../types';\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  children: (props: PanelHeaderMenuProviderApi) => ReactElement;\n}\n\nexport const PanelHeaderMenuProvider: FC<Props> = ({ panel, dashboard, children }) => {\n  const [items, setItems] = useState<PanelMenuItem[]>([]);\n  const angularComponent = useSelector((state: StoreState) => getPanelStateForModel(state, panel)?.angularComponent);\n\n  useEffect(() => {\n    setItems(getPanelMenu(dashboard, panel, angularComponent));\n  }, [dashboard, panel, angularComponent, setItems]);\n\n  return children({ items });\n};\n","import { t } from '@lingui/macro';\n\nimport { PanelMenuItem } from '@grafana/data';\nimport { AngularComponent, getDataSourceSrv, locationService } from '@grafana/runtime';\nimport { PanelCtrl } from 'app/angular/panel/panel_ctrl';\nimport config from 'app/core/config';\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 { isPanelModelLibraryPanel } from 'app/features/library-panels/guard';\nimport { store } from 'app/store/store';\n\nimport { contextSrv } from '../../../core/services/context_srv';\nimport { getExploreUrl } from '../../../core/utils/explore';\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<any>) => {\n    event.preventDefault();\n    locationService.partial({\n      viewPanel: panel.id,\n    });\n  };\n\n  const onEditPanel = (event: React.MouseEvent<any>) => {\n    event.preventDefault();\n    locationService.partial({\n      editPanel: panel.id,\n    });\n  };\n\n  const onSharePanel = (event: React.MouseEvent<any>) => {\n    event.preventDefault();\n    sharePanel(dashboard, panel);\n  };\n\n  const onAddLibraryPanel = (event: React.MouseEvent<any>) => {\n    event.preventDefault();\n    addLibraryPanel(dashboard, panel);\n  };\n\n  const onUnlinkLibraryPanel = (event: React.MouseEvent<any>) => {\n    event.preventDefault();\n    unlinkLibraryPanel(panel);\n  };\n\n  const onInspectPanel = (tab?: string) => {\n    locationService.partial({\n      inspect: panel.id,\n      inspectTab: tab,\n    });\n  };\n\n  const onMore = (event: React.MouseEvent<any>) => {\n    event.preventDefault();\n  };\n\n  const onDuplicatePanel = (event: React.MouseEvent<any>) => {\n    event.preventDefault();\n    duplicatePanel(dashboard, panel);\n  };\n\n  const onCopyPanel = (event: React.MouseEvent<any>) => {\n    event.preventDefault();\n    copyPanel(panel);\n  };\n\n  const onRemovePanel = (event: React.MouseEvent<any>) => {\n    event.preventDefault();\n    removePanel(dashboard, panel, true);\n  };\n\n  const onNavigateToExplore = (event: React.MouseEvent<any>) => {\n    event.preventDefault();\n    const openInNewWindow =\n      event.ctrlKey || event.metaKey ? (url: string) => window.open(`${config.appSubUrl}${url}`) : undefined;\n    store.dispatch(navigateToExplore(panel, { getDataSourceSrv, getTimeSrv, getExploreUrl, openInNewWindow }) as any);\n  };\n\n  const onToggleLegend = (event: React.MouseEvent) => {\n    event.preventDefault();\n    toggleLegend(panel);\n  };\n  const menu: PanelMenuItem[] = [];\n\n  if (!panel.isEditing) {\n    const viewTextTranslation = t({\n      id: 'panel.header-menu.view',\n      message: `View`,\n    });\n    menu.push({\n      text: viewTextTranslation,\n      iconClassName: 'eye',\n      onClick: onViewPanel,\n      shortcut: 'v',\n    });\n  }\n\n  if (dashboard.canEditPanel(panel) && !panel.isEditing) {\n    menu.push({\n      text: 'Edit',\n      iconClassName: 'edit',\n      onClick: onEditPanel,\n      shortcut: 'e',\n    });\n  }\n\n  const shareTextTranslation = t({\n    id: 'panel.header-menu.share',\n    message: `Share`,\n  });\n\n  menu.push({\n    text: shareTextTranslation,\n    iconClassName: 'share-alt',\n    onClick: onSharePanel,\n    shortcut: 'p s',\n  });\n\n  if (contextSrv.hasAccessToExplore() && !(panel.plugin && panel.plugin.meta.skipDataQuery)) {\n    menu.push({\n      text: 'Explore',\n      iconClassName: 'compass',\n      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    const dataTextTranslation = t({\n      id: 'panel.header-menu.inspect-data',\n      message: `Data`,\n    });\n\n    inspectMenu.push({\n      text: dataTextTranslation,\n      onClick: (e: React.MouseEvent<any>) => onInspectPanel('data'),\n    });\n\n    if (dashboard.meta.canEdit) {\n      inspectMenu.push({\n        text: 'Query',\n        onClick: (e: React.MouseEvent<any>) => onInspectPanel('query'),\n      });\n    }\n  }\n\n  const jsonTextTranslation = t({\n    id: 'panel.header-menu.inspect-json',\n    message: `Panel JSON`,\n  });\n\n  inspectMenu.push({\n    text: jsonTextTranslation,\n    onClick: (e: React.MouseEvent<any>) => onInspectPanel('json'),\n  });\n\n  const inspectTextTranslation = t({\n    id: 'panel.header-menu.inspect',\n    message: `Inspect`,\n  });\n\n  menu.push({\n    type: 'submenu',\n    text: inspectTextTranslation,\n    iconClassName: 'info-circle',\n    onClick: (e: React.MouseEvent<any>) => onInspectPanel(),\n    shortcut: 'i',\n    subMenu: inspectMenu,\n  });\n\n  const subMenu: PanelMenuItem[] = [];\n\n  if (dashboard.canEditPanel(panel) && !(panel.isViewing || panel.isEditing)) {\n    subMenu.push({\n      text: 'Duplicate',\n      onClick: onDuplicatePanel,\n      shortcut: 'p d',\n    });\n\n    subMenu.push({\n      text: 'Copy',\n      onClick: onCopyPanel,\n    });\n\n    if (isPanelModelLibraryPanel(panel)) {\n      subMenu.push({\n        text: 'Unlink library panel',\n        onClick: onUnlinkLibraryPanel,\n      });\n    } else {\n      subMenu.push({\n        text: 'Create library panel',\n        onClick: onAddLibraryPanel,\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 ? 'Hide legend' : 'Show legend',\n      onClick: onToggleLegend,\n      shortcut: 'p l',\n    });\n  }\n\n  if (!panel.isEditing && subMenu.length) {\n    const moreTextTranslation = t({\n      id: 'panel.header-menu.more',\n      message: `More...`,\n    });\n    menu.push({\n      type: 'submenu',\n      text: moreTextTranslation,\n      iconClassName: 'cube',\n      subMenu,\n      onClick: onMore,\n    });\n  }\n\n  if (dashboard.canEditPanel(panel) && !panel.isEditing && !panel.isViewing) {\n    menu.push({ type: 'divider', text: '' });\n\n    menu.push({\n      text: 'Remove',\n      iconClassName: 'trash-alt',\n      onClick: onRemovePanel,\n      shortcut: 'p r',\n    });\n  }\n\n  return menu;\n}\n","import React, { FC } from 'react';\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  onClose: () => void;\n}\n\nexport const PanelHeaderMenuWrapper: FC<Props> = ({ panel, dashboard }) => {\n  return (\n    <PanelHeaderMenuProvider panel={panel} dashboard={dashboard}>\n      {({ items }) => {\n        return <PanelHeaderMenu items={items} />;\n      }}\n    </PanelHeaderMenuProvider>\n  );\n};\n","import React, { FC } from 'react';\n\nimport { QueryResultMetaNotice } from '@grafana/data';\nimport { Icon, Tooltip } from '@grafana/ui';\n\ninterface Props {\n  notice: QueryResultMetaNotice;\n  onClick: (e: React.SyntheticEvent, tab: string) => void;\n}\n\nexport const PanelHeaderNotice: FC<Props> = ({ notice, onClick }) => {\n  const iconName =\n    notice.severity === 'error' || notice.severity === 'warning' ? 'exclamation-triangle' : 'info-circle';\n\n  return (\n    <Tooltip content={notice.text} key={notice.severity}>\n      {notice.inspect ? (\n        <div className=\"panel-info-notice pointer\" onClick={(e) => onClick(e, notice.inspect!)}>\n          <Icon name={iconName} style={{ marginRight: '8px' }} />\n        </div>\n      ) : (\n        <a className=\"panel-info-notice\" href={notice.link} target=\"_blank\" rel=\"noreferrer\">\n          <Icon name={iconName} style={{ marginRight: '8px' }} />\n        </a>\n      )}\n    </Tooltip>\n  );\n};\n","import React, { FC, 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: FC<Props> = ({ frames, panelId }) => {\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<string, QueryResultMetaNotice> = {};\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        <PanelHeaderNotice notice={notice} onClick={openInspect} key={notice.severity} />\n      ))}\n    </>\n  );\n};\n","import { css, cx } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { DataLink, GrafanaTheme2, PanelData } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\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 const PanelHeader: FC<Props> = ({ panel, error, isViewing, isEditing, data, alertState, dashboard }) => {\n  const onCancelQuery = () => panel.getQueryRunner().cancelQuery();\n  const title = panel.getDisplayTitle();\n  const className = cx('panel-header', !(isViewing || isEditing) ? 'grid-drag-handle' : '');\n  const styles = useStyles2(panelStyles);\n\n  return (\n    <>\n      <PanelHeaderLoadingIndicator state={data.state} onClick={onCancelQuery} />\n      <PanelHeaderCorner\n        panel={panel}\n        title={panel.title}\n        description={panel.description}\n        scopedVars={panel.scopedVars}\n        links={getPanelLinksSupplier(panel)}\n        error={error}\n      />\n      <div className={className}>\n        <PanelHeaderMenuTrigger data-testid={selectors.components.Panels.Panel.title(title)}>\n          {({ closeMenu, panelMenuOpen }) => {\n            return (\n              <ClickOutsideWrapper onClick={closeMenu} parent={document}>\n                <div className=\"panel-title\">\n                  <PanelHeaderNotices frames={data.series} panelId={panel.id} />\n                  {alertState ? (\n                    <Icon\n                      name={alertState === 'alerting' ? 'heart-break' : 'heart'}\n                      className=\"icon-gf panel-alert-icon\"\n                      style={{ marginRight: '4px' }}\n                      size=\"sm\"\n                    />\n                  ) : null}\n                  <h2 className={styles.titleText}>{title}</h2>\n                  {!dashboard.meta.publicDashboardAccessToken && (\n                    <div data-testid=\"panel-dropdown\">\n                      <Icon name=\"angle-down\" className=\"panel-menu-toggle\" />\n                      {panelMenuOpen ? (\n                        <PanelHeaderMenuWrapper panel={panel} dashboard={dashboard} onClose={closeMenu} />\n                      ) : null}\n                    </div>\n                  )}\n                  {data.request && data.request.timeInfo && (\n                    <span className=\"panel-time-info\">\n                      <Icon name=\"clock-nine\" size=\"sm\" /> {data.request.timeInfo}\n                    </span>\n                  )}\n                </div>\n              </ClickOutsideWrapper>\n            );\n          }}\n        </PanelHeaderMenuTrigger>\n      </div>\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 { Subscription } from 'rxjs';\n\nimport {\n  AbsoluteTimeRange,\n  AnnotationChangeEvent,\n  AnnotationEventUIModel,\n  CoreApp,\n  DashboardCursorSync,\n  EventFilterOptions,\n  FieldConfigSource,\n  getDefaultTimeRange,\n  LoadingState,\n  PanelData,\n  PanelPlugin,\n  PanelPluginMeta,\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 { ErrorBoundary, PanelContext, PanelContextProvider, SeriesVisibilityChangeMode } 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 { changeSeriesColorConfigFactory } from 'app/plugins/panel/timeseries/overrides/colorSeriesConfigFactory';\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 { loadSnapshotData } from '../utils/loadSnapshotData';\n\nimport { PanelHeader } from './PanelHeader/PanelHeader';\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  width: number;\n  height: number;\n  onInstanceStateChange: (value: any) => void;\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 PanelChrome extends PureComponent<Props, State> {\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        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      },\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  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 } = data;\n        if (error) {\n          if (errorMessage !== error.message) {\n            errorMessage = error.message;\n          }\n        }\n        break;\n      case LoadingState.Done:\n        // If we are doing a snapshot save data in panel model\n        if (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        dashboard.id,\n        dashboard.getTimezone(),\n        timeData,\n        width,\n        dashboard.meta.publicDashboardAccessToken\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 || 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  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    return (\n      <>\n        <div className={panelContentClassNames}>\n          <PanelContextProvider value={this.state.context}>\n            <PanelComponent\n              id={panel.id}\n              data={data}\n              title={panel.title}\n              timeRange={timeRange}\n              timeZone={this.props.dashboard.getTimezone()}\n              options={panelOptions}\n              fieldConfig={panel.fieldConfig}\n              transparent={panel.transparent}\n              width={panelWidth}\n              height={innerPanelHeight}\n              renderCounter={renderCounter}\n              replaceVariables={panel.replaceVariables}\n              onOptionsChange={this.onOptionsChange}\n              onFieldConfigChange={this.onFieldConfigChange}\n              onChangeTimeRange={this.onChangeTimeRange}\n              eventBus={dashboard.events}\n            />\n          </PanelContextProvider>\n        </div>\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\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-alert-state--${alertState}`]: alertState !== undefined,\n    });\n\n    return (\n      <section\n        className={containerClassNames}\n        aria-label={selectors.components.Panels.Panel.containerByTitle(panel.title)}\n      >\n        <PanelHeader\n          panel={panel}\n          dashboard={dashboard}\n          title={panel.title}\n          description={panel.description}\n          links={panel.links}\n          error={errorMessage}\n          isEditing={isEditing}\n          isViewing={isViewing}\n          alertState={alertState}\n          data={data}\n        />\n        <ErrorBoundary\n          dependencies={[data, plugin, panel.getOptions()]}\n          onError={this.onPanelError}\n          onRecover={this.onPanelErrorRecover}\n        >\n          {({ error }) => {\n            if (error) {\n              return null;\n            }\n            return this.renderPanel(width, height);\n          }}\n        </ErrorBoundary>\n      </section>\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 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';\n\nimport { PanelHeader } from './PanelHeader/PanelHeader';\n\ninterface OwnProps {\n  panel: PanelModel;\n  dashboard: DashboardModel;\n  plugin: PanelPlugin;\n  isViewing: boolean;\n  isEditing: boolean;\n  isInView: boolean;\n  width: number;\n  height: number;\n}\n\ninterface ConnectedProps {\n  angularComponent?: AngularComponent;\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<Props, State> {\n  element: HTMLElement | null = null;\n  timeSrv: TimeSrv = getTimeSrv();\n  scopeProps?: AngularScopeProps;\n  subs = new Subscription();\n\n  constructor(props: Props) {\n    super(props);\n    this.state = {\n      data: {\n        state: LoadingState.NotStarted,\n        series: [],\n        timeRange: getDefaultTimeRange(),\n      },\n    };\n  }\n\n  componentDidMount() {\n    const { panel } = this.props;\n    this.loadAngularPanel();\n\n    // subscribe to data events\n    const queryRunner = panel.getQueryRunner();\n\n    // we are not displaying any of this data so no need for transforms or field config\n    this.subs.add(\n      queryRunner.getData({ withTransforms: false, withFieldConfig: false }).subscribe({\n        next: (data: PanelData) => this.onPanelDataUpdate(data),\n      })\n    );\n  }\n\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  }\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 = '<plugin-component type=\"panel\" class=\"panel-height-helper\"></plugin-component>';\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\n    const alertState = data.alertState?.state;\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    return (\n      <div className={containerClassNames} aria-label={selectors.components.Panels.Panel.containerByTitle(panel.title)}>\n        <PanelHeader\n          panel={panel}\n          dashboard={dashboard}\n          title={panel.title}\n          description={panel.description}\n          links={panel.links}\n          error={errorMessage}\n          isViewing={isViewing}\n          isEditing={isEditing}\n          data={data}\n          alertState={alertState}\n        />\n        <div className={panelContentClassNames}>\n          <div ref={(element) => (this.element = element)} className=\"panel-height-helper\" />\n        </div>\n      </div>\n    );\n  }\n}\n\nconst mapStateToProps: MapStateToProps<ConnectedProps, OwnProps, StoreState> = (state, props) => {\n  return {\n    angularComponent: getPanelStateForModel(state, props.panel)?.angularComponent,\n  };\n};\n\nconst mapDispatchToProps: MapDispatchToProps<DispatchProps, OwnProps> = { setPanelAngularComponent };\n\nexport const PanelChromeAngular = connect(mapStateToProps, mapDispatchToProps)(PanelChromeAngularUnconnected);\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 { PanelChrome } from './PanelChrome';\nimport { PanelChromeAngular } from './PanelChromeAngular';\n\nexport interface OwnProps {\n  panel: PanelModel;\n  stateKey: string;\n  dashboard: DashboardModel;\n  isEditing: boolean;\n  isViewing: boolean;\n  width: number;\n  height: number;\n  lazy?: 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<typeof connector>;\n\nexport class DashboardPanelUnconnected extends PureComponent<Props> {\n  static defaultProps: Partial<Props> = {\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  render() {\n    const { dashboard, panel, isViewing, isEditing, width, height, lazy, plugin } = this.props;\n\n    const renderPanelChrome = (isInView: boolean) =>\n      plugin &&\n      (plugin.angularPanelCtrl ? (\n        <PanelChromeAngular\n          plugin={plugin}\n          panel={panel}\n          dashboard={dashboard}\n          isViewing={isViewing}\n          isEditing={isEditing}\n          isInView={isInView}\n          width={width}\n          height={height}\n        />\n      ) : (\n        <PanelChrome\n          plugin={plugin}\n          panel={panel}\n          dashboard={dashboard}\n          isViewing={isViewing}\n          isEditing={isEditing}\n          isInView={isInView}\n          width={width}\n          height={height}\n          onInstanceStateChange={this.onInstanceStateChange}\n        />\n      ));\n\n    return lazy ? (\n      <LazyLoader width={width} height={height} onChange={this.onVisibilityChange} onLoad={this.onPanelLoad}>\n        {({ isInView }) => renderPanelChrome(isInView)}\n      </LazyLoader>\n    ) : (\n      renderPanelChrome(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<PanelModel>;\n  error?: string;\n}\n\nexport class PanelHeaderCorner extends Component<Props> {\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      <div className=\"panel-info-content markdown-html\">\n        <div dangerouslySetInnerHTML={{ __html: markedInterpolatedMarkdown }} />\n\n        {links && links.length > 0 && (\n          <ul className=\"panel-info-corner-links\">\n            {links.map((link, idx) => {\n              return (\n                <li key={idx}>\n                  <a className=\"panel-info-corner-links__item\" href={link.href} target={link.target}>\n                    {link.title}\n                  </a>\n                </li>\n              );\n            })}\n          </ul>\n        )}\n      </div>\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      <Tooltip content={content} placement=\"top-start\" theme={theme} interactive>\n        <section className={className} onClick={onClick} aria-label={ariaLabel}>\n          <i aria-hidden className=\"fa\" />\n          <span className=\"panel-info-corner-inner\" />\n        </section>\n      </Tooltip>\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 {\n  ByNamesMatcherMode,\n  ConfigOverrideRule,\n  DataFrame,\n  DynamicConfigValue,\n  FieldConfigSource,\n  FieldMatcherID,\n  fieldMatchers,\n  FieldType,\n  getFieldDisplayName,\n  isSystemOverrideWithRef,\n  SystemConfigOverrideRule,\n} from '@grafana/data';\nimport { SeriesVisibilityChangeMode } from '@grafana/ui';\n\nconst displayOverrideRef = 'hideSeriesFrom';\nconst isHideSeriesOverride = isSystemOverrideWithRef(displayOverrideRef);\n\nexport function seriesVisibilityConfigFactory(\n  label: string,\n  mode: SeriesVisibilityChangeMode,\n  fieldConfig: FieldConfigSource,\n  data: DataFrame[]\n) {\n  const { overrides } = fieldConfig;\n\n  const displayName = label;\n  const currentIndex = overrides.findIndex(isHideSeriesOverride);\n\n  if (currentIndex < 0) {\n    if (mode === SeriesVisibilityChangeMode.ToggleSelection) {\n      const override = createOverride([displayName, ...getNamesOfHiddenFields(overrides, data)]);\n\n      return {\n        ...fieldConfig,\n        overrides: [...fieldConfig.overrides, override],\n      };\n    }\n\n    const displayNames = getDisplayNames(data, displayName);\n    const override = createOverride(displayNames);\n\n    return {\n      ...fieldConfig,\n      overrides: [...fieldConfig.overrides, override],\n    };\n  }\n\n  const overridesCopy = Array.from(overrides);\n  const [current] = overridesCopy.splice(currentIndex, 1) as SystemConfigOverrideRule[];\n\n  if (mode === SeriesVisibilityChangeMode.ToggleSelection) {\n    let existing = getExistingDisplayNames(current);\n    const nameOfHiddenFields = getNamesOfHiddenFields(overridesCopy, data);\n\n    if (nameOfHiddenFields.length > 0) {\n      existing = existing.filter((el) => nameOfHiddenFields.indexOf(el) < 0);\n    }\n\n    if (existing[0] === displayName && existing.length === 1) {\n      return {\n        ...fieldConfig,\n        overrides: overridesCopy,\n      };\n    }\n\n    const override = createOverride([displayName, ...nameOfHiddenFields]);\n\n    return {\n      ...fieldConfig,\n      overrides: [...overridesCopy, override],\n    };\n  }\n\n  const override = createExtendedOverride(current, displayName);\n\n  if (allFieldsAreExcluded(override, data)) {\n    return {\n      ...fieldConfig,\n      overrides: overridesCopy,\n    };\n  }\n\n  return {\n    ...fieldConfig,\n    overrides: [...overridesCopy, override],\n  };\n}\n\nfunction createOverride(\n  names: string[],\n  mode = ByNamesMatcherMode.exclude,\n  property?: DynamicConfigValue\n): SystemConfigOverrideRule {\n  property = property ?? {\n    id: 'custom.hideFrom',\n    value: {\n      viz: true,\n      legend: false,\n      tooltip: false,\n    },\n  };\n\n  return {\n    __systemRef: displayOverrideRef,\n    matcher: {\n      id: FieldMatcherID.byNames,\n      options: {\n        mode: mode,\n        names: names,\n        prefix: mode === ByNamesMatcherMode.exclude ? 'All except:' : undefined,\n        readOnly: true,\n      },\n    },\n    properties: [\n      {\n        ...property,\n        value: {\n          viz: true,\n          legend: false,\n          tooltip: false,\n        },\n      },\n    ],\n  };\n}\n\nconst createExtendedOverride = (\n  current: SystemConfigOverrideRule,\n  displayName: string,\n  mode = ByNamesMatcherMode.exclude\n): SystemConfigOverrideRule => {\n  const property = current.properties.find((p) => p.id === 'custom.hideFrom');\n  const existing = getExistingDisplayNames(current);\n  const index = existing.findIndex((name) => name === displayName);\n\n  if (index < 0) {\n    existing.push(displayName);\n  } else {\n    existing.splice(index, 1);\n  }\n\n  return createOverride(existing, mode, property);\n};\n\nconst getExistingDisplayNames = (rule: SystemConfigOverrideRule): string[] => {\n  const names = rule.matcher.options?.names;\n  if (!Array.isArray(names)) {\n    return [];\n  }\n  return [...names];\n};\n\nconst allFieldsAreExcluded = (override: SystemConfigOverrideRule, data: DataFrame[]): boolean => {\n  return getExistingDisplayNames(override).length === getDisplayNames(data).length;\n};\n\nconst getDisplayNames = (data: DataFrame[], excludeName?: string): string[] => {\n  const unique = new Set<string>();\n\n  for (const frame of data) {\n    for (const field of frame.fields) {\n      if (field.type !== FieldType.number) {\n        continue;\n      }\n\n      const name = getFieldDisplayName(field, frame, data);\n\n      if (name === excludeName) {\n        continue;\n      }\n\n      unique.add(name);\n    }\n  }\n\n  return Array.from(unique);\n};\n\nconst getNamesOfHiddenFields = (overrides: ConfigOverrideRule[], data: DataFrame[]): string[] => {\n  let names: string[] = [];\n\n  for (const override of overrides) {\n    const property = override.properties.find((p) => p.id === 'custom.hideFrom');\n\n    if (property !== undefined && property.value?.legend === true) {\n      const info = fieldMatchers.get(override.matcher.id);\n      const matcher = info.get(override.matcher.options);\n\n      for (const frame of data) {\n        for (const field of frame.fields) {\n          if (field.type !== FieldType.number) {\n            continue;\n          }\n\n          const name = getFieldDisplayName(field, frame, data);\n\n          if (matcher(field, frame, data)) {\n            names.push(name);\n          }\n        }\n      }\n    }\n  }\n\n  return names;\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 { dashboardWatcher } from 'app/features/live/dashboard/dashboardWatcher';\nimport { toStateKey } from 'app/features/variables/utils';\nimport { DashboardDTO, DashboardInitPhase, DashboardRoutes, StoreState, ThunkDispatch, ThunkResult } 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  urlFolderId?: string;\n  panelType?: string;\n  accessToken?: string;\n  routeName?: string;\n  fixUrl: boolean;\n}\n\nasync function fetchDashboard(\n  args: InitDashboardArgs,\n  dispatch: ThunkDispatch,\n  getState: () => StoreState\n): Promise<DashboardDTO | null> {\n  // When creating new or adding panels to a dashboard from explore we load it from local storage\n  const model = store.getObject<DashboardDTO>(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        if (args.fixUrl && dashDTO.meta.url) {\n          // check if the current url is correct (might be old slug)\n          const dashboardUrl = locationUtil.stripBaseFromUrl(dashDTO.meta.url);\n          const currentPath = 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.urlFolderId, 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<void> {\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      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(urlFolderId?: string, panelType?: string): any {\n  const data = {\n    meta: {\n      canStar: false,\n      canShare: false,\n      canDelete: false,\n      isNew: true,\n      folderId: 0,\n    },\n    dashboard: {\n      title: 'New dashboard',\n      panels: [\n        {\n          type: panelType ?? 'add-panel',\n          gridPos: { x: 0, y: 0, w: 12, h: 9 },\n          title: 'Panel Title',\n        },\n      ],\n    },\n  };\n\n  if (urlFolderId) {\n    data.meta.folderId = parseInt(urlFolderId, 10);\n  }\n\n  return data;\n}\n\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 { reportMetaAnalytics, MetaAnalyticsEventName, DashboardViewEventPayload } from '@grafana/runtime';\n\nimport { DashboardModel } from './DashboardModel';\n\nexport function emitDashboardViewEvent(dashboard: DashboardModel) {\n  const eventData: DashboardViewEventPayload = {\n    dashboardId: dashboard.id,\n    dashboardName: dashboard.title,\n    dashboardUid: dashboard.uid,\n    folderName: dashboard.meta.folderTitle,\n    eventName: MetaAnalyticsEventName.DashboardView,\n  };\n\n  reportMetaAnalytics(eventData);\n}\n","import { applyFieldOverrides, ArrayDataFrame, getDefaultTimeRange, LoadingState, PanelData } from '@grafana/data';\nimport { config } from 'app/core/config';\n\nimport { SnapshotWorker } from '../../query/state/DashboardQueryRunner/SnapshotWorker';\nimport { getProcessedDataFrames } from '../../query/state/runRequest';\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 = [new ArrayDataFrame(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  Actions = 'actions', // ALPHA!\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<string, DisplayValue>;\n}\n\ninterface DataLinkScopedVars extends ScopedVars {\n  __series: ScopedVar<SeriesVars>;\n  __field: ScopedVar<FieldVars>;\n  __value: ScopedVar<ValueVars>;\n  __data: ScopedVar<DataViewVars>;\n}\n\n/**\n * Link suppliers creates link models based on a link origin\n */\nexport const getFieldLinksSupplier = (value: FieldDisplay): LinkModelSupplier<FieldDisplay> | 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<DataLinkScopedVars> = {};\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.get(value.rowIndex),\n                numeric: value.display.numeric,\n                text: formattedValueToString(value.display),\n                time: timeField ? timeField.values.get(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<PanelModel> | 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"],"names":["LazyLoader","children","width","height","onLoad","onChange","id","useUniqueId","loaded","setLoaded","useState","isInView","setIsInView","wrapperRef","useRef","useEffectOnce","addCallback","entry","isIntersecting","wrapperEl","current","observer","observe","callbacks","unobserve","Object","keys","length","disconnect","ref","style","c","IntersectionObserver","entries","target","rootMargin","createOverride","label","color","matcher","FieldMatcherID","options","properties","createProperty","value","mode","FieldColorModeId","fixedColor","isSoloRoute","path","test","toLowerCase","PanelHeaderLoadingIndicator","state","onClick","styles","useStyles","getStyles","LoadingState","className","Tooltip","content","Icon","name","title","streamIndicator","theme","css","colors","textFaint","PanelHeaderMenuTrigger","divProps","clickCoordinates","setClickCoordinates","x","y","panelMenuOpen","setPanelMenuOpen","onMenuToggle","useCallback","event","clicked","eventToClickCoordinates","onMouseDown","closeMenu","Math","floor","clientX","clientY","PanelHeaderMenu","PureComponent","menu","isSubMenu","role","map","menuItem","idx","PanelHeaderMenuItem","type","text","iconClassName","shortcut","subMenu","renderItems","render","this","props","items","PanelHeaderMenuProvider","panel","dashboard","setItems","angularComponent","useSelector","getPanelStateForModel","useEffect","onViewPanel","preventDefault","locationService","viewPanel","onEditPanel","editPanel","onAddLibraryPanel","addLibraryPanel","onUnlinkLibraryPanel","unlinkLibraryPanel","onInspectPanel","tab","inspect","inspectTab","onMore","onDuplicatePanel","duplicatePanel","onCopyPanel","copyPanel","onRemovePanel","removePanel","onNavigateToExplore","openInNewWindow","ctrlKey","metaKey","url","window","open","config","undefined","store","navigateToExplore","getDataSourceSrv","getTimeSrv","getExploreUrl","onToggleLegend","toggleLegend","isEditing","viewTextTranslation","push","canEditPanel","shareTextTranslation","sharePanel","contextSrv","plugin","meta","skipDataQuery","inspectMenu","dataTextTranslation","e","canEdit","jsonTextTranslation","inspectTextTranslation","isViewing","isPanelModelLibraryPanel","scope","getScope","panelCtrl","$$childHead","ctrl","angularMenuItems","getExtendedMenu","item","reactItem","href","click","$eval","legend","showLegend","moreTextTranslation","getPanelMenu","PanelHeaderMenuWrapper","PanelHeaderNotice","notice","iconName","severity","marginRight","link","rel","PanelHeaderNotices","frames","panelId","openInspect","stopPropagation","notices","frame","values","PanelHeader","error","data","alertState","getDisplayTitle","cx","useStyles2","panelStyles","getQueryRunner","cancelQuery","PanelHeaderCorner","description","scopedVars","links","getPanelLinksSupplier","selectors","ClickOutsideWrapper","parent","document","series","size","titleText","publicDashboardAccessToken","onClose","request","timeInfo","typography","fontWeightMedium","body","fontSize","primary","PanelChrome","constructor","super","Subscription","onlyLocal","DashboardCursorSync","graphTooltip","onInstanceStateChange","setState","context","instanceState","onFieldConfigChange","fieldConfig","overrides","currentIndex","findIndex","override","overridesCopy","Array","from","existing","propertyIndex","p","propertiesCopy","changeSeriesColorConfigFactory","seriesVisibilityConfigFactory","sortKey","legendOptions","sortDesc","sortBy","onOptionsChange","refreshWhenInView","timeData","applyPanelTimeOverrides","timeSrv","timeRange","wantsQueryExecution","runAllPanelQueries","getTimezone","renderCounter","liveTime","stateUpdate","updateOptions","updateFieldConfig","errorMessage","message","async","isRegion","to","anno","dashboardUID","uid","time","timeEnd","tags","saveAnnotation","getDashboardQueryRunner","run","range","eventBus","publish","AnnotationChangeEvent","deleteAnnotation","updateAnnotation","setTime","toUtc","events","newScopedBus","eventFilter","isFirstLoad","app","getPanelContextApp","sync","getSync","onSeriesColorChange","onToggleSeriesVisibility","onSeriesVisibilityChange","onAnnotationCreate","onAnnotationUpdate","onAnnotationDelete","onToggleLegendSort","canAddAnnotations","bind","canEditAnnotations","canDeleteAnnotations","getInitialPanelDataState","CoreApp","getDefaultTimeRange","componentDidMount","subs","add","subscribe","RefreshEvent","onRefresh","RenderEvent","onRender","panelInitialized","hasPanelSnapshot","loadSnapshotData","getData","withTransforms","withFieldConfig","next","onDataUpdate","liveTimer","componentWillUnmount","unsubscribe","liveTimeChanged","delta","valueOf","console","log","componentDidUpdate","prevProps","snapshot","snapshotData","toDataFrameDTO","shouldSignalRenderingCompleted","loadingState","pluginMeta","skipFirstRender","renderPanel","profiler","PanelComponent","headerHeight","hasOverlayHeader","panelHeaderHeight","chromePadding","noPadding","panelPadding","panelWidth","PANEL_BORDER","innerPanelHeight","panelContentClassNames","classNames","panelOptions","getOptions","PanelContextProvider","timeZone","transparent","replaceVariables","onChangeTimeRange","hasTitle","containerClassNames","pathname","ErrorBoundary","dependencies","onError","onPanelError","onRecover","onPanelErrorRecover","PanelChromeAngularUnconnected","loadAngularPanel","queryRunner","onPanelDataUpdate","prevState","scopeProps","getInnerPanelHeight","getInnerPanelWidth","setPanelAngularComponent","element","loader","getAngularLoader","key","load","alert","mapDispatchToProps","PanelChromeAngular","connect","initPanelState","setPanelInstanceState","connector","panelState","panels","stateKey","DashboardPanelUnconnected","v","lazy","onPanelLoad","renderPanelChrome","angularPanelCtrl","onVisibilityChange","DashboardPanel","InfoMode","Component","Error","Info","Links","markdown","interpolatedMarkdown","getTemplateSrv","replace","markedInterpolatedMarkdown","renderMarkdown","getLinks","dangerouslySetInnerHTML","__html","InspectTab","renderCornerType","infoMode","ariaLabel","placement","interactive","getInfoMode","onClickError","getInfoContent","displayOverrideRef","isHideSeriesOverride","isSystemOverrideWithRef","displayName","SeriesVisibilityChangeMode","getNamesOfHiddenFields","getDisplayNames","splice","getExistingDisplayNames","nameOfHiddenFields","filter","el","indexOf","createExtendedOverride","allFieldsAreExcluded","names","ByNamesMatcherMode","property","viz","tooltip","__systemRef","prefix","readOnly","find","index","rule","isArray","excludeName","unique","Set","field","fields","FieldType","getFieldDisplayName","fieldMatchers","get","getQueriesByDatasource","queries","forEach","targets","datasource","initDashboard","args","dispatch","getState","dashboardInitFetching","dashDTO","model","DASHBOARD_FROM_LS_KEY","removeDashboardToFetchFromLocalStorage","routeName","DashboardRoutes","backendSrv","redirectUri","newUrl","locationUtil","canSave","canShare","canStar","dashboardLoaderSrv","urlSlug","accessToken","urlType","urlUid","fixUrl","dashboardUrl","currentPath","getNewDashboardModelData","urlFolderId","panelType","err","isFetchError","cancelled","dashboardInitFailed","fetchDashboard","dashboardInitServices","DashboardModel","storeState","queryParams","orgId","user","getDashboardSrv","setCurrent","init","dashboardUid","toStateKey","initVariablesTransaction","createDashboardQueryRunner","getIfExistsLastKey","initPhase","DashboardInitPhase","processRepeats","autofitpanels","autoFitPanels","innerHeight","kiosk","keybindingSrv","notifyApp","createErrorNotification","eventData","dashboardId","dashboardName","folderName","folderTitle","eventName","MetaAnalyticsEventName","reportMetaAnalytics","emitDashboardViewEvent","dashboardWatcher","weekStart","setWeekStart","appEvents","DashboardLoadedEvent","userId","grafanaVersion","dashboardInitCompleted","canDelete","isNew","folderId","gridPos","w","h","parseInt","setDashboardToFetchFromLocalStorage","getProcessedDataFrames","worker","SnapshotWorker","annotationEvents","canWork","getAnnotationsInSnapshot","annotations","ArrayDataFrame","applyFieldOverrides","defaults","fieldConfigRegistry","getFieldLinksSupplier","view","dataFrame","refId","colIndex","labels","rowIndex","timeField","getTimeField","raw","numeric","display","formattedValueToString","getFieldDisplayValuesProxy","calc","vars","fmt","finalVars","getLinkSrv","getDataLinkUIModel"],"sourceRoot":""}