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