{"version":3,"file":"heatmapPanel.f6f29a53ed0f682b4404.js","mappings":"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","sources":["webpack://grafana/./public/app/core/components/ColorScale/ColorScale.tsx","webpack://grafana/./public/app/plugins/panel/heatmap/renderHistogram.tsx","webpack://grafana/./public/app/plugins/panel/heatmap/tooltip/utils.ts","webpack://grafana/./public/app/plugins/panel/heatmap/HeatmapHoverView.tsx","webpack://grafana/./public/app/plugins/panel/heatmap/HeatmapHoverViewOld.tsx","webpack://grafana/./public/app/plugins/panel/heatmap/utils.ts","webpack://grafana/./public/app/plugins/panel/heatmap/fields.ts","webpack://grafana/./public/app/plugins/panel/heatmap/palettes.ts","webpack://grafana/./public/app/plugins/panel/heatmap/HeatmapPanel.tsx","webpack://grafana/./public/app/plugins/panel/heatmap/migrations.ts","webpack://grafana/./public/app/plugins/panel/heatmap/suggestions.ts","webpack://grafana/./public/app/plugins/panel/heatmap/module.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport React, { useState, useEffect } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useTheme2 } from '@grafana/ui';\n\ntype Props = {\n colorPalette: string[];\n min: number;\n max: number;\n\n // Show a value as string -- when not defined, the raw values will not be shown\n display?: (v: number) => string;\n hoverValue?: number;\n useStopsPercentage?: boolean;\n};\n\ntype HoverState = {\n isShown: boolean;\n value: number;\n};\n\nconst GRADIENT_STOPS = 10;\n\nexport const ColorScale = ({ colorPalette, min, max, display, hoverValue, useStopsPercentage }: Props) => {\n const [colors, setColors] = useState([]);\n const [scaleHover, setScaleHover] = useState({ isShown: false, value: 0 });\n const [percent, setPercent] = useState(null); // 0-100 for CSS percentage\n\n const theme = useTheme2();\n const styles = getStyles(theme, colors);\n\n useEffect(() => {\n setColors(getGradientStops({ colorArray: colorPalette, stops: GRADIENT_STOPS, useStopsPercentage }));\n }, [colorPalette, useStopsPercentage]);\n\n const onScaleMouseMove = (event: React.MouseEvent) => {\n const divOffset = event.nativeEvent.offsetX;\n const offsetWidth = event.currentTarget.offsetWidth;\n const normPercentage = Math.floor((divOffset * 100) / offsetWidth + 1);\n const scaleValue = Math.floor(((max - min) * normPercentage) / 100 + min);\n\n setScaleHover({ isShown: true, value: scaleValue });\n setPercent(normPercentage);\n };\n\n const onScaleMouseLeave = () => {\n setScaleHover({ isShown: false, value: 0 });\n };\n\n useEffect(() => {\n setPercent(hoverValue == null ? null : clampPercent100((hoverValue - min) / (max - min)));\n }, [hoverValue, min, max]);\n\n return (\n
\n
\n {display && (scaleHover.isShown || hoverValue !== undefined) && (\n
\n
\n
\n )}\n
\n {display && (\n
\n
\n {display(min)}\n {display(max)}\n
\n {percent != null && (scaleHover.isShown || hoverValue !== undefined) && (\n \n {display(hoverValue ?? scaleHover.value)}\n \n )}\n
\n )}\n
\n );\n};\n\nconst getGradientStops = ({\n colorArray,\n stops,\n useStopsPercentage = true,\n}: {\n colorArray: string[];\n stops: number;\n useStopsPercentage?: boolean;\n}): string[] => {\n const colorCount = colorArray.length;\n if (useStopsPercentage && colorCount <= 20) {\n const incr = (1 / colorCount) * 100;\n let per = 0;\n const stops: string[] = [];\n for (const color of colorArray) {\n if (per > 0) {\n stops.push(`${color} ${per}%`);\n } else {\n stops.push(color);\n }\n per += incr;\n stops.push(`${color} ${per}%`);\n }\n return stops;\n }\n\n const gradientEnd = colorArray[colorCount - 1];\n const skip = Math.ceil(colorCount / stops);\n const gradientStops = new Set();\n\n for (let i = 0; i < colorCount; i += skip) {\n gradientStops.add(colorArray[i]);\n }\n\n gradientStops.add(gradientEnd);\n\n return [...gradientStops];\n};\n\nfunction clampPercent100(v: number) {\n if (v > 1) {\n return 100;\n }\n if (v < 0) {\n return 0;\n }\n return v * 100;\n}\n\nconst getStyles = (theme: GrafanaTheme2, colors: string[]) => ({\n scaleWrapper: css({\n width: '100%',\n fontSize: '11px',\n opacity: 1,\n }),\n scaleGradient: css({\n background: `linear-gradient(90deg, ${colors.join()})`,\n height: '9px',\n pointerEvents: 'none',\n borderRadius: theme.shape.radius.default,\n }),\n legendValues: css({\n display: 'flex',\n justifyContent: 'space-between',\n pointerEvents: 'none',\n }),\n hoverValue: css({\n position: 'absolute',\n marginTop: '-14px',\n padding: '3px 15px',\n transform: 'translateX(-50%)',\n }),\n followerContainer: css({\n position: 'relative',\n pointerEvents: 'none',\n whiteSpace: 'nowrap',\n }),\n follower: css({\n position: 'absolute',\n height: '13px',\n width: '13px',\n borderRadius: theme.shape.radius.default,\n transform: 'translateX(-50%) translateY(-50%)',\n border: `2px solid ${theme.colors.text.primary}`,\n top: '5px',\n }),\n disabled: css({\n color: theme.colors.text.disabled,\n }),\n});\n","export function renderHistogram(\n can: React.RefObject,\n histCanWidth: number,\n histCanHeight: number,\n xVals: number[],\n countVals: number[],\n index: number,\n yBucketCount: number\n) {\n let histCtx = can.current?.getContext('2d');\n\n if (histCtx != null) {\n let fromIdx = index;\n\n while (xVals[fromIdx--] === xVals[index]) {}\n\n fromIdx++;\n\n let toIdx = fromIdx + yBucketCount;\n\n let maxCount = 0;\n\n let i = fromIdx;\n while (i < toIdx) {\n let c = countVals[i];\n maxCount = Math.max(maxCount, c);\n i++;\n }\n\n let pHov = new Path2D();\n let pRest = new Path2D();\n\n i = fromIdx;\n let j = 0;\n while (i < toIdx) {\n let c = countVals[i];\n\n if (c > 0) {\n let pctY = c / maxCount;\n let pctX = j / (yBucketCount + 1);\n\n let p = i === index ? pHov : pRest;\n\n p.rect(\n Math.round(histCanWidth * pctX),\n Math.round(histCanHeight * (1 - pctY)),\n Math.round(histCanWidth / yBucketCount),\n Math.round(histCanHeight * pctY)\n );\n }\n\n i++;\n j++;\n }\n\n histCtx.clearRect(0, 0, histCanWidth, histCanHeight);\n\n histCtx.fillStyle = '#2E3036';\n histCtx.fill(pRest);\n\n histCtx.fillStyle = '#5794F2';\n histCtx.fill(pHov);\n }\n}\n","import { DataFrame, Field } from '@grafana/data';\n\nimport { HeatmapData } from '../fields';\n\ntype BucketsMinMax = {\n xBucketMin: number;\n xBucketMax: number;\n yBucketMin: string;\n yBucketMax: string;\n};\n\nexport const getHoverCellColor = (data: HeatmapData, index: number) => {\n const colorPalette = data.heatmapColors?.palette!;\n const colorIndex = data.heatmapColors?.values[index];\n\n let cellColor: string | undefined = undefined;\n\n if (colorIndex != null) {\n cellColor = colorPalette[colorIndex];\n }\n\n return { cellColor, colorPalette };\n};\n\nconst conversions: Record = {\n year: 1000 * 60 * 60 * 24 * 365,\n month: 1000 * 60 * 60 * 24 * 30,\n week: 1000 * 60 * 60 * 24 * 7,\n day: 1000 * 60 * 60 * 24,\n h: 1000 * 60 * 60,\n m: 1000 * 60,\n s: 1000,\n ms: 1,\n};\n\nconst noPluralize = new Set(['ms', 's', 'm', 'h']);\n\n// @TODO: display \"~ 1 year/month\"?\nexport const formatMilliseconds = (milliseconds: number) => {\n let value = 1;\n let unit = 'ms';\n\n for (unit in conversions) {\n if (milliseconds >= conversions[unit]) {\n value = Math.floor(milliseconds / conversions[unit]);\n break;\n }\n }\n\n const plural = value !== 1 && !noPluralize.has(unit);\n const unitString = plural ? unit + 's' : unit;\n\n return `${value} ${unitString}`;\n};\n\nexport const getFieldFromData = (data: DataFrame, fieldType: string, isSparse: boolean) => {\n let field: Field | undefined;\n\n switch (fieldType) {\n case 'x':\n field = isSparse\n ? data?.fields.find(({ name }) => name === 'x' || name === 'xMin' || name === 'xMax')\n : data?.fields[0];\n break;\n case 'y':\n field = isSparse\n ? data?.fields.find(({ name }) => name === 'y' || name === 'yMin' || name === 'yMax')\n : data?.fields[1];\n break;\n case 'count':\n field = isSparse ? data?.fields.find(({ name }) => name === 'count') : data?.fields[2];\n break;\n }\n\n return field;\n};\n\nexport const getSparseCellMinMax = (data: HeatmapData, index: number): BucketsMinMax => {\n let fields = data.heatmap!.fields;\n\n let xMax = fields.find((f) => f.name === 'xMax')!;\n let yMin = fields.find((f) => f.name === 'yMin')!;\n let yMax = fields.find((f) => f.name === 'yMax')!;\n\n let interval = xMax.config.interval!;\n\n return {\n xBucketMin: xMax.values[index] - interval,\n xBucketMax: xMax.values[index],\n yBucketMin: yMin.values[index],\n yBucketMax: yMax.values[index],\n };\n};\n","import React, { ReactElement, useEffect, useRef, useState } from 'react';\nimport uPlot from 'uplot';\n\nimport {\n DataFrameType,\n Field,\n FieldType,\n formattedValueToString,\n getFieldDisplayName,\n getLinksSupplier,\n InterpolateFunction,\n LinkModel,\n PanelData,\n ScopedVars,\n} from '@grafana/data';\nimport { HeatmapCellLayout } from '@grafana/schema';\nimport { TooltipDisplayMode, useStyles2 } from '@grafana/ui';\nimport { VizTooltipContent } from '@grafana/ui/src/components/VizTooltip/VizTooltipContent';\nimport { VizTooltipFooter } from '@grafana/ui/src/components/VizTooltip/VizTooltipFooter';\nimport { VizTooltipHeader } from '@grafana/ui/src/components/VizTooltip/VizTooltipHeader';\nimport { ColorIndicator, ColorPlacement, LabelValue } from '@grafana/ui/src/components/VizTooltip/types';\nimport { ColorScale } from 'app/core/components/ColorScale/ColorScale';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport { isHeatmapCellsDense, readHeatmapRowsCustomMeta } from 'app/features/transformers/calculateHeatmap/heatmap';\nimport { DataHoverView } from 'app/features/visualization/data-hover/DataHoverView';\n\nimport { getStyles } from '../timeseries/TimeSeriesTooltip';\n\nimport { HeatmapData } from './fields';\nimport { renderHistogram } from './renderHistogram';\nimport { formatMilliseconds, getFieldFromData, getHoverCellColor, getSparseCellMinMax } from './tooltip/utils';\n\ninterface Props {\n mode: TooltipDisplayMode;\n dataIdxs: Array;\n seriesIdx: number | null | undefined;\n dataRef: React.MutableRefObject;\n showHistogram?: boolean;\n showColorScale?: boolean;\n isPinned: boolean;\n dismiss: () => void;\n panelData: PanelData;\n replaceVars: InterpolateFunction;\n scopedVars: ScopedVars[];\n annotate?: () => void;\n}\n\nexport const HeatmapHoverView = (props: Props) => {\n if (props.seriesIdx === 2) {\n return (\n \n );\n }\n\n return ;\n};\n\nconst HeatmapHoverCell = ({\n dataIdxs,\n dataRef,\n showHistogram,\n isPinned,\n showColorScale = false,\n scopedVars,\n replaceVars,\n mode,\n annotate,\n}: Props) => {\n const index = dataIdxs[1]!;\n const data = dataRef.current;\n\n const [isSparse] = useState(\n () => data.heatmap?.meta?.type === DataFrameType.HeatmapCells && !isHeatmapCellsDense(data.heatmap)\n );\n\n const xField = getFieldFromData(data.heatmap!, 'x', isSparse)!;\n const yField = getFieldFromData(data.heatmap!, 'y', isSparse)!;\n const countField = getFieldFromData(data.heatmap!, 'count', isSparse)!;\n\n const xDisp = (v: number) => {\n if (xField?.display) {\n return formattedValueToString(xField.display(v));\n }\n if (xField?.type === FieldType.time) {\n const tooltipTimeFormat = 'YYYY-MM-DD HH:mm:ss';\n const dashboard = getDashboardSrv().getCurrent();\n return dashboard?.formatDate(v, tooltipTimeFormat);\n }\n return `${v}`;\n };\n\n const xVals = xField.values;\n const yVals = yField.values;\n const countVals = countField.values;\n\n // labeled buckets\n const meta = readHeatmapRowsCustomMeta(data.heatmap);\n const yDisp = yField?.display ? (v: string) => formattedValueToString(yField.display!(v)) : (v: string) => `${v}`;\n\n let interval = xField?.config.interval;\n\n let yBucketMin: string;\n let yBucketMax: string;\n\n let xBucketMin: number;\n let xBucketMax: number;\n\n let nonNumericOrdinalDisplay: string | undefined = undefined;\n\n let contentItems: LabelValue[] = [];\n\n const getYValueIndex = (idx: number) => {\n return idx % data.yBucketCount! ?? 0;\n };\n\n let yValueIdx = getYValueIndex(index);\n\n const getData = (idx: number = index) => {\n if (meta.yOrdinalDisplay) {\n const yMinIdx = data.yLayout === HeatmapCellLayout.le ? yValueIdx - 1 : yValueIdx;\n const yMaxIdx = data.yLayout === HeatmapCellLayout.le ? yValueIdx : yValueIdx + 1;\n yBucketMin = yMinIdx < 0 ? meta.yMinDisplay! : `${meta.yOrdinalDisplay[yMinIdx]}`;\n yBucketMax = `${meta.yOrdinalDisplay[yMaxIdx]}`;\n\n // e.g. \"pod-xyz123\"\n if (!meta.yOrdinalLabel || Number.isNaN(+meta.yOrdinalLabel[0])) {\n nonNumericOrdinalDisplay = data.yLayout === HeatmapCellLayout.le ? yBucketMax : yBucketMin;\n }\n } else {\n const value = yVals?.[yValueIdx];\n\n if (data.yLayout === HeatmapCellLayout.le) {\n yBucketMax = `${value}`;\n\n if (data.yLog) {\n let logFn = data.yLog === 2 ? Math.log2 : Math.log10;\n let exp = logFn(value) - 1 / data.yLogSplit!;\n yBucketMin = `${data.yLog ** exp}`;\n } else {\n yBucketMin = `${value - data.yBucketSize!}`;\n }\n } else {\n yBucketMin = `${value}`;\n\n if (data.yLog) {\n let logFn = data.yLog === 2 ? Math.log2 : Math.log10;\n let exp = logFn(value) + 1 / data.yLogSplit!;\n yBucketMax = `${data.yLog ** exp}`;\n } else {\n yBucketMax = `${value + data.yBucketSize!}`;\n }\n }\n }\n\n if (data.xLayout === HeatmapCellLayout.le) {\n xBucketMax = xVals[idx];\n xBucketMin = xBucketMax - data.xBucketSize!;\n } else {\n xBucketMin = xVals[idx];\n xBucketMax = xBucketMin + data.xBucketSize!;\n }\n };\n\n if (isSparse) {\n ({ xBucketMin, xBucketMax, yBucketMin, yBucketMax } = getSparseCellMinMax(data!, index));\n } else {\n getData();\n }\n\n const { cellColor, colorPalette } = getHoverCellColor(data, index);\n\n const getDisplayData = (fromIdx: number, toIdx: number) => {\n let vals = [];\n for (let idx = fromIdx; idx <= toIdx; idx++) {\n if (!countVals?.[idx]) {\n continue;\n }\n\n const color = getHoverCellColor(data, idx).cellColor;\n count = getCountValue(idx);\n\n if (isSparse) {\n ({ xBucketMin, xBucketMax, yBucketMin, yBucketMax } = getSparseCellMinMax(data!, idx));\n } else {\n yValueIdx = getYValueIndex(idx);\n getData(idx);\n }\n\n const { label, value } = getContentLabels()[0];\n\n vals.push({\n label,\n value,\n color: color ?? '#FFF',\n isActive: index === idx,\n });\n }\n\n return vals;\n };\n\n const getContentLabels = (): LabelValue[] => {\n const isMulti = mode === TooltipDisplayMode.Multi && !isPinned;\n\n if (nonNumericOrdinalDisplay) {\n return isMulti\n ? [{ label: `Name ${nonNumericOrdinalDisplay}`, value: data.display!(count) }]\n : [{ label: 'Name', value: nonNumericOrdinalDisplay }];\n }\n\n switch (data.yLayout) {\n case HeatmapCellLayout.unknown:\n return isMulti\n ? [{ label: yDisp(yBucketMin), value: data.display!(count) }]\n : [{ label: '', value: yDisp(yBucketMin) }];\n }\n\n return isMulti\n ? [\n {\n label: `Bucket ${yDisp(yBucketMin)}` + '-' + `${yDisp(yBucketMax)}`,\n value: data.display!(count),\n },\n ]\n : [\n {\n label: 'Bucket',\n value: `${yDisp(yBucketMin)}` + '-' + `${yDisp(yBucketMax)}`,\n },\n ];\n };\n\n const getCountValue = (idx: number) => {\n return countVals?.[idx];\n };\n\n let count = getCountValue(index);\n\n if (mode === TooltipDisplayMode.Single || isPinned) {\n const fromToInt: LabelValue[] = interval ? [{ label: 'Duration', value: formatMilliseconds(interval) }] : [];\n\n contentItems = [\n {\n label: getFieldDisplayName(countField, data.heatmap),\n value: data.display!(count),\n color: cellColor ?? '#FFF',\n colorPlacement: ColorPlacement.trailing,\n colorIndicator: ColorIndicator.value,\n },\n ...getContentLabels(),\n ...fromToInt,\n ];\n }\n\n if (mode === TooltipDisplayMode.Multi && !isPinned) {\n let xVal = xField.values[index];\n let fromIdx = index;\n let toIdx = index;\n\n while (xField.values[fromIdx - 1] === xVal) {\n fromIdx--;\n }\n\n while (xField.values[toIdx + 1] === xVal) {\n toIdx++;\n }\n\n const vals: LabelValue[] = getDisplayData(fromIdx, toIdx);\n vals.forEach((val) => {\n contentItems.push({\n label: val.label,\n value: val.value,\n color: val.color ?? '#FFF',\n colorIndicator: ColorIndicator.value,\n colorPlacement: ColorPlacement.trailing,\n isActive: val.isActive,\n });\n });\n }\n\n const visibleFields = data.heatmap?.fields.filter((f) => !Boolean(f.config.custom?.hideFrom?.tooltip));\n const links: Array> = [];\n const linkLookup = new Set();\n\n for (const field of visibleFields ?? []) {\n const hasLinks = field.config.links && field.config.links.length > 0;\n\n if (hasLinks && data.heatmap) {\n const appropriateScopedVars = scopedVars.find(\n (scopedVar) =>\n scopedVar && scopedVar.__dataContext && scopedVar.__dataContext.value.field.name === nonNumericOrdinalDisplay\n );\n\n field.getLinks = getLinksSupplier(data.heatmap, field, appropriateScopedVars || {}, replaceVars);\n }\n\n if (field.getLinks) {\n const value = field.values[index];\n const display = field.display ? field.display(value) : { text: `${value}`, numeric: +value };\n\n field.getLinks({ calculatedValue: display, valueRowIndex: index }).forEach((link) => {\n const key = `${link.title}/${link.href}`;\n if (!linkLookup.has(key)) {\n links.push(link);\n linkLookup.add(key);\n }\n });\n }\n }\n\n let can = useRef(null);\n\n let histCssWidth = 264;\n let histCssHeight = 64;\n let histCanWidth = Math.round(histCssWidth * uPlot.pxRatio);\n let histCanHeight = Math.round(histCssHeight * uPlot.pxRatio);\n\n useEffect(\n () => {\n if (showHistogram && xVals != null && countVals != null && mode === TooltipDisplayMode.Single) {\n renderHistogram(can, histCanWidth, histCanHeight, xVals, countVals, index, data.yBucketCount!);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [index]\n );\n\n const headerLabel: LabelValue = {\n label: '',\n value: xDisp(xBucketMax!)!,\n };\n\n let customContent: ReactElement[] = [];\n\n if (mode === TooltipDisplayMode.Single) {\n // Histogram\n if (showHistogram && !isSparse) {\n customContent.push(\n \n );\n }\n\n // Color scale\n if (colorPalette && showColorScale) {\n customContent.push(\n \n );\n }\n }\n\n const styles = useStyles2(getStyles);\n\n return (\n
\n \n \n {isPinned && }\n
\n );\n};\n","import React, { useEffect, useRef, useState } from 'react';\nimport uPlot from 'uplot';\n\nimport {\n DataFrameType,\n Field,\n FieldType,\n formattedValueToString,\n getFieldDisplayName,\n LinkModel,\n TimeRange,\n getLinksSupplier,\n InterpolateFunction,\n ScopedVars,\n} from '@grafana/data';\nimport { HeatmapCellLayout } from '@grafana/schema';\nimport { LinkButton, VerticalGroup } from '@grafana/ui';\nimport { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport { isHeatmapCellsDense, readHeatmapRowsCustomMeta } from 'app/features/transformers/calculateHeatmap/heatmap';\nimport { DataHoverView } from 'app/features/visualization/data-hover/DataHoverView';\n\nimport { HeatmapData } from './fields';\nimport { renderHistogram } from './renderHistogram';\nimport { HeatmapHoverEvent } from './utils';\n\ntype Props = {\n data: HeatmapData;\n hover: HeatmapHoverEvent;\n showHistogram?: boolean;\n timeRange: TimeRange;\n replaceVars: InterpolateFunction;\n scopedVars: ScopedVars[];\n};\n\nexport const HeatmapHoverView = (props: Props) => {\n if (props.hover.seriesIdx === 2) {\n return ;\n }\n return ;\n};\n\nconst HeatmapHoverCell = ({ data, hover, showHistogram = false, scopedVars, replaceVars }: Props) => {\n const index = hover.dataIdx;\n\n const [isSparse] = useState(\n () => data.heatmap?.meta?.type === DataFrameType.HeatmapCells && !isHeatmapCellsDense(data.heatmap)\n );\n\n const xField = data.heatmap?.fields[0];\n const yField = data.heatmap?.fields[1];\n const countField = data.heatmap?.fields[2];\n\n const xDisp = (v: number) => {\n if (xField?.display) {\n return formattedValueToString(xField.display(v));\n }\n if (xField?.type === FieldType.time) {\n const tooltipTimeFormat = 'YYYY-MM-DD HH:mm:ss';\n const dashboard = getDashboardSrv().getCurrent();\n return dashboard?.formatDate(v, tooltipTimeFormat);\n }\n return `${v}`;\n };\n\n const xVals = xField?.values;\n const yVals = yField?.values;\n const countVals = countField?.values;\n\n // labeled buckets\n const meta = readHeatmapRowsCustomMeta(data.heatmap);\n const yDisp = yField?.display ? (v: string) => formattedValueToString(yField.display!(v)) : (v: string) => `${v}`;\n\n const yValueIdx = index % data.yBucketCount! ?? 0;\n\n let yBucketMin: string;\n let yBucketMax: string;\n\n let nonNumericOrdinalDisplay: string | undefined = undefined;\n\n if (meta.yOrdinalDisplay) {\n const yMinIdx = data.yLayout === HeatmapCellLayout.le ? yValueIdx - 1 : yValueIdx;\n const yMaxIdx = data.yLayout === HeatmapCellLayout.le ? yValueIdx : yValueIdx + 1;\n yBucketMin = yMinIdx < 0 ? meta.yMinDisplay! : `${meta.yOrdinalDisplay[yMinIdx]}`;\n yBucketMax = `${meta.yOrdinalDisplay[yMaxIdx]}`;\n\n // e.g. \"pod-xyz123\"\n if (!meta.yOrdinalLabel || Number.isNaN(+meta.yOrdinalLabel[0])) {\n nonNumericOrdinalDisplay = data.yLayout === HeatmapCellLayout.le ? yBucketMax : yBucketMin;\n }\n } else {\n const value = yVals?.[yValueIdx];\n\n if (data.yLayout === HeatmapCellLayout.le) {\n yBucketMax = `${value}`;\n\n if (data.yLog) {\n let logFn = data.yLog === 2 ? Math.log2 : Math.log10;\n let exp = logFn(value) - 1 / data.yLogSplit!;\n yBucketMin = `${data.yLog ** exp}`;\n } else {\n yBucketMin = `${value - data.yBucketSize!}`;\n }\n } else {\n yBucketMin = `${value}`;\n\n if (data.yLog) {\n let logFn = data.yLog === 2 ? Math.log2 : Math.log10;\n let exp = logFn(value) + 1 / data.yLogSplit!;\n yBucketMax = `${data.yLog ** exp}`;\n } else {\n yBucketMax = `${value + data.yBucketSize!}`;\n }\n }\n }\n\n let xBucketMin: number;\n let xBucketMax: number;\n\n if (data.xLayout === HeatmapCellLayout.le) {\n xBucketMax = xVals?.[index];\n xBucketMin = xBucketMax - data.xBucketSize!;\n } else {\n xBucketMin = xVals?.[index];\n xBucketMax = xBucketMin + data.xBucketSize!;\n }\n\n const count = countVals?.[index];\n\n const visibleFields = data.heatmap?.fields.filter((f) => !Boolean(f.config.custom?.hideFrom?.tooltip));\n const links: Array> = [];\n const linkLookup = new Set();\n\n for (const field of visibleFields ?? []) {\n const hasLinks = field.config.links && field.config.links.length > 0;\n\n if (hasLinks && data.heatmap) {\n const appropriateScopedVars = scopedVars.find(\n (scopedVar) =>\n scopedVar && scopedVar.__dataContext && scopedVar.__dataContext.value.field.name === nonNumericOrdinalDisplay\n );\n\n field.getLinks = getLinksSupplier(data.heatmap, field, appropriateScopedVars || {}, replaceVars);\n }\n\n if (field.getLinks) {\n const value = field.values[index];\n const display = field.display ? field.display(value) : { text: `${value}`, numeric: +value };\n\n field.getLinks({ calculatedValue: display, valueRowIndex: index }).forEach((link) => {\n const key = `${link.title}/${link.href}`;\n if (!linkLookup.has(key)) {\n links.push(link);\n linkLookup.add(key);\n }\n });\n }\n }\n\n let can = useRef(null);\n\n let histCssWidth = 264;\n let histCssHeight = 64;\n let histCanWidth = Math.round(histCssWidth * uPlot.pxRatio);\n let histCanHeight = Math.round(histCssHeight * uPlot.pxRatio);\n\n useEffect(\n () => {\n if (showHistogram && xVals != null && countVals != null) {\n renderHistogram(can, histCanWidth, histCanHeight, xVals, countVals, index, data.yBucketCount!);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [index]\n );\n\n if (isSparse) {\n return (\n
\n \n
\n );\n }\n\n const renderYBucket = () => {\n if (nonNumericOrdinalDisplay) {\n return
Name: {nonNumericOrdinalDisplay}
;\n }\n\n switch (data.yLayout) {\n case HeatmapCellLayout.unknown:\n return
{yDisp(yBucketMin)}
;\n }\n return (\n
\n Bucket: {yDisp(yBucketMin)} - {yDisp(yBucketMax)}\n
\n );\n };\n\n return (\n <>\n
\n
{xDisp(xBucketMin)}
\n {data.xLayout !== HeatmapCellLayout.unknown &&
{xDisp(xBucketMax)}
}\n
\n {showHistogram && (\n \n )}\n
\n {renderYBucket()}\n
\n {getFieldDisplayName(countField!, data.heatmap)}: {data.display!(count)}\n
\n
\n {links.length > 0 && (\n \n {links.map((link, i) => (\n \n {link.title}\n \n ))}\n \n )}\n \n );\n};\n","import { MutableRefObject, RefObject } from 'react';\nimport uPlot, { Cursor } from 'uplot';\n\nimport {\n DashboardCursorSync,\n DataFrameType,\n DataHoverClearEvent,\n DataHoverEvent,\n DataHoverPayload,\n EventBus,\n formattedValueToString,\n getValueFormat,\n GrafanaTheme2,\n incrRoundDn,\n incrRoundUp,\n TimeRange,\n FieldType,\n} from '@grafana/data';\nimport { AxisPlacement, ScaleDirection, ScaleDistribution, ScaleOrientation, HeatmapCellLayout } from '@grafana/schema';\nimport { UPlotConfigBuilder } from '@grafana/ui';\nimport { isHeatmapCellsDense, readHeatmapRowsCustomMeta } from 'app/features/transformers/calculateHeatmap/heatmap';\n\nimport { pointWithin, Quadtree, Rect } from '../barchart/quadtree';\n\nimport { HeatmapData } from './fields';\nimport { FieldConfig, YAxisConfig } from './types';\n\ninterface PathbuilderOpts {\n each: (u: uPlot, seriesIdx: number, dataIdx: number, lft: number, top: number, wid: number, hgt: number) => void;\n gap?: number | null;\n hideLE?: number;\n hideGE?: number;\n xAlign?: -1 | 0 | 1;\n yAlign?: -1 | 0 | 1;\n ySizeDivisor?: number;\n disp: {\n fill: {\n values: (u: uPlot, seriesIndex: number) => number[];\n index: Array;\n };\n };\n}\n\ninterface PointsBuilderOpts {\n each: (u: uPlot, seriesIdx: number, dataIdx: number, lft: number, top: number, wid: number, hgt: number) => void;\n}\n\nexport interface HeatmapHoverEvent {\n seriesIdx: number;\n dataIdx: number;\n pageX: number;\n pageY: number;\n}\n\nexport interface HeatmapZoomEvent {\n xMin: number;\n xMax: number;\n}\n\ninterface PrepConfigOpts {\n dataRef: RefObject;\n theme: GrafanaTheme2;\n eventBus: EventBus;\n onhover?: null | ((evt?: HeatmapHoverEvent | null) => void);\n onclick?: null | ((evt?: Object) => void);\n onzoom?: null | ((evt: HeatmapZoomEvent) => void);\n isToolTipOpen?: MutableRefObject;\n timeZone: string;\n getTimeRange: () => TimeRange;\n exemplarColor: string;\n cellGap?: number | null; // in css pixels\n hideLE?: number;\n hideGE?: number;\n yAxisConfig: YAxisConfig;\n ySizeDivisor?: number;\n sync?: () => DashboardCursorSync;\n // Identifies the shared key for uPlot cursor sync\n eventsScope?: string;\n}\n\nexport function prepConfig(opts: PrepConfigOpts) {\n const {\n dataRef,\n theme,\n eventBus,\n onhover,\n onclick,\n isToolTipOpen,\n timeZone,\n getTimeRange,\n cellGap,\n hideLE,\n hideGE,\n yAxisConfig,\n ySizeDivisor,\n sync,\n eventsScope = '__global_',\n } = opts;\n\n const xScaleKey = 'x';\n let xScaleUnit = 'time';\n let isTime = true;\n\n if (dataRef.current?.heatmap?.fields[0].type !== FieldType.time) {\n xScaleUnit = dataRef.current?.heatmap?.fields[0].config?.unit ?? 'x';\n isTime = false;\n }\n\n const pxRatio = devicePixelRatio;\n\n let heatmapType = dataRef.current?.heatmap?.meta?.type;\n const exemplarFillColor = theme.visualization.getColorByName(opts.exemplarColor);\n\n let qt: Quadtree;\n let hRect: Rect | null;\n\n let builder = new UPlotConfigBuilder(timeZone);\n\n let rect: DOMRect;\n\n builder.addHook('init', (u) => {\n u.root.querySelectorAll('.u-cursor-pt').forEach((el) => {\n Object.assign(el.style, {\n borderRadius: '0',\n border: '1px solid white',\n background: 'transparent',\n });\n });\n\n onclick &&\n u.over.addEventListener(\n 'mouseup',\n (e) => {\n // @ts-ignore\n let isDragging: boolean = u.cursor.drag._x || u.cursor.drag._y;\n\n if (!isDragging) {\n onclick(e);\n }\n },\n true\n );\n });\n\n if (isTime) {\n // this is a tmp hack because in mode: 2, uplot does not currently call scales.x.range() for setData() calls\n // scales.x.range() typically reads back from drilled-down panelProps.timeRange via getTimeRange()\n builder.addHook('setData', (u) => {\n //let [min, max] = (u.scales!.x!.range! as uPlot.Range.Function)(u, 0, 100, xScaleKey);\n\n let { min: xMin, max: xMax } = u.scales!.x;\n\n let min = getTimeRange().from.valueOf();\n let max = getTimeRange().to.valueOf();\n\n if (xMin !== min || xMax !== max) {\n queueMicrotask(() => {\n u.setScale(xScaleKey, { min, max });\n });\n }\n });\n }\n\n // rect of .u-over (grid area)\n builder.addHook('syncRect', (u, r) => {\n rect = r;\n });\n\n const payload: DataHoverPayload = {\n point: {\n [xScaleUnit]: null,\n },\n data: dataRef.current?.heatmap,\n };\n\n const hoverEvent = new DataHoverEvent(payload).setTags(['uplot']);\n const clearEvent = new DataHoverClearEvent().setTags(['uplot']);\n\n let pendingOnleave: ReturnType | 0;\n\n onhover &&\n builder.addHook('setLegend', (u) => {\n if (u.cursor.idxs != null) {\n for (let i = 0; i < u.cursor.idxs.length; i++) {\n const sel = u.cursor.idxs[i];\n if (sel != null) {\n const { left, top } = u.cursor;\n payload.rowIndex = sel;\n payload.point[xScaleUnit] = u.posToVal(left!, xScaleKey);\n eventBus.publish(hoverEvent);\n\n if (!isToolTipOpen?.current) {\n if (pendingOnleave) {\n clearTimeout(pendingOnleave);\n pendingOnleave = 0;\n }\n onhover({\n seriesIdx: i,\n dataIdx: sel,\n pageX: rect.left + left!,\n pageY: rect.top + top!,\n });\n }\n return;\n }\n }\n }\n\n if (!isToolTipOpen?.current) {\n // if tiles have gaps, reduce flashing / re-render (debounce onleave by 100ms)\n if (!pendingOnleave) {\n pendingOnleave = setTimeout(() => {\n onhover(null);\n eventBus.publish(clearEvent);\n }, 100);\n }\n }\n });\n\n builder.addHook('drawClear', (u) => {\n qt = qt || new Quadtree(0, 0, u.bbox.width, u.bbox.height);\n\n qt.clear();\n\n // force-clear the path cache to cause drawBars() to rebuild new quadtree\n u.series.forEach((s, i) => {\n if (i > 0) {\n // @ts-ignore\n s._paths = null;\n }\n });\n });\n\n builder.setMode(2);\n\n builder.addScale({\n scaleKey: xScaleKey,\n isTime,\n orientation: ScaleOrientation.Horizontal,\n direction: ScaleDirection.Right,\n // TODO: expand by x bucket size and layout\n range: (u, dataMin, dataMax) => {\n if (isTime) {\n return [getTimeRange().from.valueOf(), getTimeRange().to.valueOf()];\n } else {\n if (dataRef.current?.xLayout === HeatmapCellLayout.le) {\n return [dataMin - dataRef.current?.xBucketSize!, dataMax];\n } else if (dataRef.current?.xLayout === HeatmapCellLayout.ge) {\n return [dataMin, dataMax + dataRef.current?.xBucketSize!];\n } else {\n let offset = dataRef.current?.xBucketSize! / 2;\n\n return [dataMin - offset, dataMax + offset];\n }\n }\n },\n });\n\n let incrs;\n\n if (!isTime) {\n incrs = [];\n\n for (let i = 0; i < 10; i++) {\n incrs.push(i * dataRef.current?.xBucketSize!);\n }\n }\n\n builder.addAxis({\n scaleKey: xScaleKey,\n placement: AxisPlacement.Bottom,\n incrs,\n isTime,\n theme: theme,\n timeZone,\n });\n\n const yField = dataRef.current?.heatmap?.fields[1]!;\n if (!yField) {\n return builder; // early abort (avoids error)\n }\n\n const yFieldConfig: FieldConfig | undefined = yField.config?.custom;\n const yScale = yFieldConfig?.scaleDistribution ?? { type: ScaleDistribution.Linear };\n const yAxisReverse = Boolean(yAxisConfig.reverse);\n const isSparseHeatmap = heatmapType === DataFrameType.HeatmapCells && !isHeatmapCellsDense(dataRef.current?.heatmap!);\n const shouldUseLogScale = yScale.type !== ScaleDistribution.Linear || isSparseHeatmap;\n const isOrdinalY = readHeatmapRowsCustomMeta(dataRef.current?.heatmap).yOrdinalDisplay != null;\n\n // random to prevent syncing y in other heatmaps\n // TODO: try to match TimeSeries y keygen algo to sync with TimeSeries panels (when not isOrdinalY)\n const yScaleKey = 'y_' + (Math.random() + 1).toString(36).substring(7);\n\n builder.addScale({\n scaleKey: yScaleKey,\n isTime: false,\n // distribution: ScaleDistribution.Ordinal, // does not work with facets/scatter yet\n orientation: ScaleOrientation.Vertical,\n direction: yAxisReverse ? ScaleDirection.Down : ScaleDirection.Up,\n // should be tweakable manually\n distribution: shouldUseLogScale ? ScaleDistribution.Log : ScaleDistribution.Linear,\n log: yScale.log ?? 2,\n range:\n // sparse already accounts for le/ge by explicit yMin & yMax cell bounds, so no need to expand y range\n isSparseHeatmap\n ? (u, dataMin, dataMax) => {\n // ...but uPlot currently only auto-ranges from the yMin facet data, so we have to grow by 1 extra factor\n // @ts-ignore\n let bucketFactor = u.data[1][2][0] / u.data[1][1][0];\n\n dataMax *= bucketFactor;\n\n let scaleMin: number | null, scaleMax: number | null;\n\n [scaleMin, scaleMax] = shouldUseLogScale\n ? uPlot.rangeLog(dataMin, dataMax, (yScale.log ?? 2) as unknown as uPlot.Scale.LogBase, true)\n : [dataMin, dataMax];\n\n if (shouldUseLogScale && !isOrdinalY) {\n let yExp = u.scales[yScaleKey].log!;\n let log = yExp === 2 ? Math.log2 : Math.log10;\n\n let { min: explicitMin, max: explicitMax } = yAxisConfig;\n\n // guard against <= 0\n if (explicitMin != null && explicitMin > 0) {\n // snap to magnitude\n let minLog = log(explicitMin);\n scaleMin = yExp ** incrRoundDn(minLog, 1);\n }\n\n if (explicitMax != null && explicitMax > 0) {\n let maxLog = log(explicitMax);\n scaleMax = yExp ** incrRoundUp(maxLog, 1);\n }\n }\n\n return [scaleMin, scaleMax];\n }\n : // dense and ordinal only have one of yMin|yMax|y, so expand range by one cell in the direction of le/ge/unknown\n (u, dataMin, dataMax) => {\n let scaleMin = dataMin,\n scaleMax = dataMax;\n\n let { min: explicitMin, max: explicitMax } = yAxisConfig;\n\n // logarithmic expansion\n if (shouldUseLogScale) {\n let yExp = u.scales[yScaleKey].log!;\n\n let minExpanded = false;\n let maxExpanded = false;\n\n let log = yExp === 2 ? Math.log2 : Math.log10;\n\n if (ySizeDivisor !== 1) {\n let minLog = log(dataMin);\n let maxLog = log(dataMax);\n\n if (!Number.isInteger(minLog)) {\n scaleMin = yExp ** incrRoundDn(minLog, 1);\n minExpanded = true;\n }\n\n if (!Number.isInteger(maxLog)) {\n scaleMax = yExp ** incrRoundUp(maxLog, 1);\n maxExpanded = true;\n }\n }\n\n if (dataRef.current?.yLayout === HeatmapCellLayout.le) {\n if (!minExpanded) {\n scaleMin /= yExp;\n }\n } else if (dataRef.current?.yLayout === HeatmapCellLayout.ge) {\n if (!maxExpanded) {\n scaleMax *= yExp;\n }\n } else {\n scaleMin /= yExp / 2;\n scaleMax *= yExp / 2;\n }\n\n if (!isOrdinalY) {\n // guard against <= 0\n if (explicitMin != null && explicitMin > 0) {\n // snap down to magnitude\n let minLog = log(explicitMin);\n scaleMin = yExp ** incrRoundDn(minLog, 1);\n }\n\n if (explicitMax != null && explicitMax > 0) {\n let maxLog = log(explicitMax);\n scaleMax = yExp ** incrRoundUp(maxLog, 1);\n }\n }\n }\n // linear expansion\n else {\n let bucketSize = dataRef.current?.yBucketSize;\n\n if (bucketSize === 0) {\n bucketSize = 1;\n }\n\n if (bucketSize) {\n if (dataRef.current?.yLayout === HeatmapCellLayout.le) {\n scaleMin -= bucketSize!;\n } else if (dataRef.current?.yLayout === HeatmapCellLayout.ge) {\n scaleMax += bucketSize!;\n } else {\n scaleMin -= bucketSize! / 2;\n scaleMax += bucketSize! / 2;\n }\n } else {\n // how to expand scale range if inferred non-regular or log buckets?\n }\n\n if (!isOrdinalY) {\n scaleMin = explicitMin ?? scaleMin;\n scaleMax = explicitMax ?? scaleMax;\n }\n }\n\n return [scaleMin, scaleMax];\n },\n });\n\n const dispY = yField.display ?? getValueFormat('short');\n\n builder.addAxis({\n scaleKey: yScaleKey,\n show: yAxisConfig.axisPlacement !== AxisPlacement.Hidden,\n placement: yAxisConfig.axisPlacement || AxisPlacement.Left,\n size: yAxisConfig.axisWidth || null,\n label: yAxisConfig.axisLabel,\n theme: theme,\n formatValue: (v, decimals) => formattedValueToString(dispY(v, decimals)),\n splits: isOrdinalY\n ? (self: uPlot) => {\n const meta = readHeatmapRowsCustomMeta(dataRef.current?.heatmap);\n if (!meta.yOrdinalDisplay) {\n return [0, 1]; //?\n }\n let splits = meta.yOrdinalDisplay.map((v, idx) => idx);\n\n switch (dataRef.current?.yLayout) {\n case HeatmapCellLayout.le:\n splits.unshift(-1);\n break;\n case HeatmapCellLayout.ge:\n splits.push(splits.length);\n break;\n }\n\n // Skip labels when the height is too small\n if (self.height < 60) {\n splits = [splits[0], splits[splits.length - 1]];\n } else {\n while (splits.length > 3 && (self.height - 15) / splits.length < 10) {\n splits = splits.filter((v, idx) => idx % 2 === 0); // remove half the items\n }\n }\n return splits;\n }\n : undefined,\n values: isOrdinalY\n ? (self: uPlot, splits) => {\n const meta = readHeatmapRowsCustomMeta(dataRef.current?.heatmap);\n if (meta.yOrdinalDisplay) {\n return splits.map((v) =>\n v < 0\n ? meta.yMinDisplay ?? '' // Check prometheus style labels\n : meta.yOrdinalDisplay[v] ?? ''\n );\n }\n return splits;\n }\n : undefined,\n });\n\n const pathBuilder = isSparseHeatmap ? heatmapPathsSparse : heatmapPathsDense;\n\n // heatmap layer\n builder.addSeries({\n facets: [\n {\n scale: xScaleKey,\n auto: true,\n sorted: 1,\n },\n {\n scale: yScaleKey,\n auto: true,\n },\n ],\n pathBuilder: pathBuilder({\n each: (u, seriesIdx, dataIdx, x, y, xSize, ySize) => {\n qt.add({\n x: x - u.bbox.left,\n y: y - u.bbox.top,\n w: xSize,\n h: ySize,\n sidx: seriesIdx,\n didx: dataIdx,\n });\n },\n gap: cellGap,\n hideLE,\n hideGE,\n xAlign:\n dataRef.current?.xLayout === HeatmapCellLayout.le\n ? -1\n : dataRef.current?.xLayout === HeatmapCellLayout.ge\n ? 1\n : 0,\n yAlign: ((dataRef.current?.yLayout === HeatmapCellLayout.le\n ? -1\n : dataRef.current?.yLayout === HeatmapCellLayout.ge\n ? 1\n : 0) * (yAxisReverse ? -1 : 1)) as -1 | 0 | 1,\n ySizeDivisor,\n disp: {\n fill: {\n values: (u, seriesIdx) => dataRef.current?.heatmapColors?.values!,\n index: dataRef.current?.heatmapColors?.palette!,\n },\n },\n }),\n theme,\n scaleKey: '', // facets' scales used (above)\n });\n\n // exemplars layer\n builder.addSeries({\n facets: [\n {\n scale: xScaleKey,\n auto: true,\n sorted: 1,\n },\n {\n scale: yScaleKey,\n auto: true,\n },\n ],\n pathBuilder: heatmapPathsPoints(\n {\n each: (u, seriesIdx, dataIdx, x, y, xSize, ySize) => {\n qt.add({\n x: x - u.bbox.left,\n y: y - u.bbox.top,\n w: xSize,\n h: ySize,\n sidx: seriesIdx,\n didx: dataIdx,\n });\n },\n },\n exemplarFillColor\n ),\n theme,\n scaleKey: '', // facets' scales used (above)\n });\n\n const cursor: Cursor = {\n drag: {\n x: true,\n y: false,\n setScale: false,\n },\n dataIdx: (u, seriesIdx) => {\n if (seriesIdx === 1) {\n hRect = null;\n\n let cx = u.cursor.left! * pxRatio;\n let cy = u.cursor.top! * pxRatio;\n\n qt.get(cx, cy, 1, 1, (o) => {\n if (pointWithin(cx, cy, o.x, o.y, o.x + o.w, o.y + o.h)) {\n hRect = o;\n }\n });\n }\n\n return hRect && seriesIdx === hRect.sidx ? hRect.didx : null;\n },\n points: {\n fill: 'rgba(255,255,255, 0.3)',\n bbox: (u, seriesIdx) => {\n let isHovered = hRect && seriesIdx === hRect.sidx;\n\n return {\n left: isHovered ? hRect!.x / pxRatio : -10,\n top: isHovered ? hRect!.y / pxRatio : -10,\n width: isHovered ? hRect!.w / pxRatio : 0,\n height: isHovered ? hRect!.h / pxRatio : 0,\n };\n },\n },\n };\n\n if (sync && sync() !== DashboardCursorSync.Off) {\n cursor.sync = {\n key: eventsScope,\n scales: [xScaleKey, null],\n filters: {\n pub: (type: string, src: uPlot, x: number, y: number, w: number, h: number, dataIdx: number) => {\n if (x < 0) {\n payload.point[xScaleUnit] = null;\n eventBus.publish(new DataHoverClearEvent());\n } else {\n payload.point[xScaleUnit] = src.posToVal(x, xScaleKey);\n eventBus.publish(hoverEvent);\n }\n\n return true;\n },\n },\n };\n\n builder.setSync();\n }\n\n builder.setCursor(cursor);\n\n return builder;\n}\n\nconst CRISP_EDGES_GAP_MIN = 4;\n\nexport function heatmapPathsDense(opts: PathbuilderOpts) {\n const { disp, each, gap = 1, hideLE = -Infinity, hideGE = Infinity, xAlign = 1, yAlign = 1, ySizeDivisor = 1 } = opts;\n\n const pxRatio = devicePixelRatio;\n\n const round = gap! >= CRISP_EDGES_GAP_MIN ? Math.round : (v: number) => v;\n\n const cellGap = Math.round(gap! * pxRatio);\n\n return (u: uPlot, seriesIdx: number) => {\n uPlot.orient(\n u,\n seriesIdx,\n (\n series,\n dataX,\n dataY,\n scaleX,\n scaleY,\n valToPosX,\n valToPosY,\n xOff,\n yOff,\n xDim,\n yDim,\n moveTo,\n lineTo,\n rect,\n arc\n ) => {\n let d = u.data[seriesIdx];\n const xs = d[0] as unknown as number[];\n const ys = d[1] as unknown as number[];\n const counts = d[2] as unknown as number[];\n const dlen = xs.length;\n\n // fill colors are mapped from interpolating densities / counts along some gradient\n // (should be quantized to 64 colors/levels max. e.g. 16)\n let fills = disp.fill.values(u, seriesIdx);\n let fillPalette = disp.fill.index ?? [...new Set(fills)];\n\n let fillPaths = fillPalette.map((color) => new Path2D());\n\n // detect x and y bin qtys by detecting layout repetition in x & y data\n let yBinQty = dlen - ys.lastIndexOf(ys[0]);\n let xBinQty = dlen / yBinQty;\n let yBinIncr = ys[1] - ys[0] || scaleY.max! - scaleY.min!;\n let xBinIncr = xs[yBinQty] - xs[0];\n\n // uniform tile sizes based on zoom level\n let xSize: number;\n let ySize: number;\n\n if (scaleX.distr === 3) {\n xSize = Math.abs(valToPosX(xs[0] * scaleX.log!, scaleX, xDim, xOff) - valToPosX(xs[0], scaleX, xDim, xOff));\n } else {\n xSize = Math.abs(valToPosX(xBinIncr, scaleX, xDim, xOff) - valToPosX(0, scaleX, xDim, xOff));\n }\n\n if (scaleY.distr === 3) {\n ySize =\n Math.abs(valToPosY(ys[0] * scaleY.log!, scaleY, yDim, yOff) - valToPosY(ys[0], scaleY, yDim, yOff)) /\n ySizeDivisor;\n } else {\n ySize = Math.abs(valToPosY(yBinIncr, scaleY, yDim, yOff) - valToPosY(0, scaleY, yDim, yOff)) / ySizeDivisor;\n }\n\n // clamp min tile size to 1px\n xSize = Math.max(1, round(xSize - cellGap));\n ySize = Math.max(1, round(ySize - cellGap));\n\n // bucket agg direction\n // let xCeil = false;\n // let yCeil = false;\n\n let xOffset = xAlign === -1 ? -xSize : xAlign === 0 ? -xSize / 2 : 0;\n let yOffset = yAlign === 1 ? -ySize : yAlign === 0 ? -ySize / 2 : 0;\n\n // pre-compute x and y offsets\n let cys = ys.slice(0, yBinQty).map((y) => round(valToPosY(y, scaleY, yDim, yOff) + yOffset));\n let cxs = Array.from({ length: xBinQty }, (v, i) =>\n round(valToPosX(xs[i * yBinQty], scaleX, xDim, xOff) + xOffset)\n );\n\n for (let i = 0; i < dlen; i++) {\n if (counts[i] > hideLE && counts[i] < hideGE) {\n let cx = cxs[~~(i / yBinQty)];\n let cy = cys[i % yBinQty];\n\n let fillPath = fillPaths[fills[i]];\n\n rect(fillPath, cx, cy, xSize, ySize);\n\n each(u, 1, i, cx, cy, xSize, ySize);\n }\n }\n\n u.ctx.save();\n //\tu.ctx.globalAlpha = 0.8;\n u.ctx.rect(u.bbox.left, u.bbox.top, u.bbox.width, u.bbox.height);\n u.ctx.clip();\n fillPaths.forEach((p, i) => {\n u.ctx.fillStyle = fillPalette[i];\n u.ctx.fill(p);\n });\n u.ctx.restore();\n\n return null;\n }\n );\n\n return null;\n };\n}\n\nexport function heatmapPathsPoints(opts: PointsBuilderOpts, exemplarColor: string) {\n return (u: uPlot, seriesIdx: number) => {\n uPlot.orient(\n u,\n seriesIdx,\n (\n series,\n dataX,\n dataY,\n scaleX,\n scaleY,\n valToPosX,\n valToPosY,\n xOff,\n yOff,\n xDim,\n yDim,\n moveTo,\n lineTo,\n rect,\n arc\n ) => {\n //console.time('heatmapPathsSparse');\n\n let points = new Path2D();\n let fillPaths = [points];\n let fillPalette = [exemplarColor ?? 'rgba(255,0,255,0.7)'];\n\n for (let i = 0; i < dataX.length; i++) {\n let yVal = dataY[i]!;\n\n // this is a hacky by-proxy check\n // works okay since we have no exemplars in calculated heatmaps and...\n // - heatmap-rows has ordinal y\n // - heatmap-cells has log2 y\n let isSparseHeatmap = scaleY.distr === 3 && scaleY.log === 2;\n\n if (!isSparseHeatmap) {\n yVal -= 0.5; // center vertically in bucket (when tiles are le)\n // y-randomize vertically to distribute exemplars in same bucket at same time\n let randSign = Math.round(Math.random()) * 2 - 1;\n yVal += randSign * 0.5 * Math.random();\n }\n\n let x = valToPosX(dataX[i], scaleX, xDim, xOff);\n let y = valToPosY(yVal, scaleY, yDim, yOff);\n let w = 8;\n let h = 8;\n\n rect(points, x - w / 2, y - h / 2, w, h);\n\n opts.each(u, seriesIdx, i, x - w / 2, y - h / 2, w, h);\n }\n\n u.ctx.save();\n u.ctx.rect(u.bbox.left, u.bbox.top, u.bbox.width, u.bbox.height);\n u.ctx.clip();\n fillPaths.forEach((p, i) => {\n u.ctx.fillStyle = fillPalette[i];\n u.ctx.fill(p);\n });\n u.ctx.restore();\n }\n );\n\n return null;\n };\n}\n// accepts xMax, yMin, yMax, count\n// xbinsize? x tile sizes are uniform?\nexport function heatmapPathsSparse(opts: PathbuilderOpts) {\n const { disp, each, gap = 1, hideLE = -Infinity, hideGE = Infinity } = opts;\n\n const pxRatio = devicePixelRatio;\n\n const round = gap! >= CRISP_EDGES_GAP_MIN ? Math.round : (v: number) => v;\n\n const cellGap = Math.round(gap! * pxRatio);\n\n return (u: uPlot, seriesIdx: number) => {\n uPlot.orient(\n u,\n seriesIdx,\n (\n series,\n dataX,\n dataY,\n scaleX,\n scaleY,\n valToPosX,\n valToPosY,\n xOff,\n yOff,\n xDim,\n yDim,\n moveTo,\n lineTo,\n rect,\n arc\n ) => {\n //console.time('heatmapPathsSparse');\n\n let d = u.data[seriesIdx];\n const xMaxs = d[0] as unknown as number[]; // xMax, do we get interval?\n const yMins = d[1] as unknown as number[];\n const yMaxs = d[2] as unknown as number[];\n const counts = d[3] as unknown as number[];\n const dlen = xMaxs.length;\n\n // fill colors are mapped from interpolating densities / counts along some gradient\n // (should be quantized to 64 colors/levels max. e.g. 16)\n let fills = disp.fill.values(u, seriesIdx);\n let fillPalette = disp.fill.index ?? [...new Set(fills)];\n\n let fillPaths = fillPalette.map((color) => new Path2D());\n\n // cache all tile bounds\n let xOffs = new Map();\n let yOffs = new Map();\n\n for (let i = 0; i < xMaxs.length; i++) {\n let xMax = xMaxs[i];\n let yMin = yMins[i];\n let yMax = yMaxs[i];\n\n if (!xOffs.has(xMax)) {\n xOffs.set(xMax, round(valToPosX(xMax, scaleX, xDim, xOff)));\n }\n\n if (!yOffs.has(yMin)) {\n yOffs.set(yMin, round(valToPosY(yMin, scaleY, yDim, yOff)));\n }\n\n if (!yOffs.has(yMax)) {\n yOffs.set(yMax, round(valToPosY(yMax, scaleY, yDim, yOff)));\n }\n }\n\n // uniform x size (interval, step)\n let xSizeUniform = xOffs.get(xMaxs.find((v) => v !== xMaxs[0])) - xOffs.get(xMaxs[0]);\n\n for (let i = 0; i < dlen; i++) {\n if (counts[i] <= hideLE || counts[i] >= hideGE) {\n continue;\n }\n\n let xMax = xMaxs[i];\n let yMin = yMins[i];\n let yMax = yMaxs[i];\n\n let xMaxPx = xOffs.get(xMax); // xSize is from interval, or inferred delta?\n let yMinPx = yOffs.get(yMin);\n let yMaxPx = yOffs.get(yMax);\n\n let xSize = xSizeUniform;\n let ySize = yMinPx - yMaxPx;\n\n // clamp min tile size to 1px\n xSize = Math.max(1, xSize - cellGap);\n ySize = Math.max(1, ySize - cellGap);\n\n let x = xMaxPx - cellGap / 2 - xSize;\n let y = yMaxPx + cellGap / 2;\n\n let fillPath = fillPaths[fills[i]];\n\n rect(fillPath, x, y, xSize, ySize);\n\n each(u, 1, i, x, y, xSize, ySize);\n }\n\n u.ctx.save();\n //\tu.ctx.globalAlpha = 0.8;\n u.ctx.rect(u.bbox.left, u.bbox.top, u.bbox.width, u.bbox.height);\n u.ctx.clip();\n fillPaths.forEach((p, i) => {\n u.ctx.fillStyle = fillPalette[i];\n u.ctx.fill(p);\n });\n u.ctx.restore();\n\n //console.timeEnd('heatmapPathsSparse');\n }\n );\n\n return null;\n };\n}\n\nexport const boundedMinMax = (\n values: number[],\n minValue?: number,\n maxValue?: number,\n hideLE = -Infinity,\n hideGE = Infinity\n) => {\n if (minValue == null) {\n minValue = Infinity;\n\n for (let i = 0; i < values.length; i++) {\n if (values[i] > hideLE && values[i] < hideGE) {\n minValue = Math.min(minValue, values[i]);\n }\n }\n }\n\n if (maxValue == null) {\n maxValue = -Infinity;\n\n for (let i = 0; i < values.length; i++) {\n if (values[i] > hideLE && values[i] < hideGE) {\n maxValue = Math.max(maxValue, values[i]);\n }\n }\n }\n\n return [minValue, maxValue];\n};\n\nexport const valuesToFills = (values: number[], palette: string[], minValue: number, maxValue: number): number[] => {\n let range = maxValue - minValue || 1;\n\n let paletteSize = palette.length;\n\n let indexedFills = Array(values.length);\n\n for (let i = 0; i < values.length; i++) {\n indexedFills[i] =\n values[i] < minValue\n ? 0\n : values[i] > maxValue\n ? paletteSize - 1\n : Math.min(paletteSize - 1, Math.floor((paletteSize * (values[i] - minValue)) / range));\n }\n\n return indexedFills;\n};\n","import {\n cacheFieldDisplayNames,\n DataFrame,\n DataFrameType,\n Field,\n FieldType,\n formattedValueToString,\n getDisplayProcessor,\n GrafanaTheme2,\n InterpolateFunction,\n LinkModel,\n outerJoinDataFrames,\n ValueFormatter,\n ValueLinkConfig,\n} from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport { HeatmapCellLayout } from '@grafana/schema';\nimport {\n calculateHeatmapFromData,\n isHeatmapCellsDense,\n readHeatmapRowsCustomMeta,\n rowsToCellsHeatmap,\n} from 'app/features/transformers/calculateHeatmap/heatmap';\nimport { parseSampleValue, sortSeriesByLabel } from 'app/plugins/datasource/prometheus/result_transformer';\n\nimport { CellValues, Options } from './types';\nimport { boundedMinMax, valuesToFills } from './utils';\n\nexport interface HeatmapData {\n heatmap?: DataFrame; // data we will render\n heatmapColors?: {\n // quantized palette\n palette: string[];\n // indices into palette\n values: number[];\n\n // color scale range\n minValue: number;\n maxValue: number;\n };\n\n exemplars?: DataFrame; // optionally linked exemplars\n exemplarColor?: string;\n\n xBucketSize?: number;\n yBucketSize?: number;\n\n xBucketCount?: number;\n yBucketCount?: number;\n\n xLayout?: HeatmapCellLayout;\n yLayout?: HeatmapCellLayout;\n\n xLog?: number;\n yLog?: number;\n\n xLogSplit?: number;\n yLogSplit?: number;\n\n // Print a heatmap cell value\n display?: (v: number) => string;\n\n // Errors\n warning?: string;\n}\n\nexport function prepareHeatmapData(\n frames: DataFrame[],\n annotations: DataFrame[] | undefined,\n options: Options,\n palette: string[],\n theme: GrafanaTheme2,\n getFieldLinks?: (exemplars: DataFrame, field: Field) => (config: ValueLinkConfig) => Array>,\n replaceVariables?: InterpolateFunction\n): HeatmapData {\n if (!frames?.length) {\n return {};\n }\n\n cacheFieldDisplayNames(frames);\n\n const exemplars = annotations?.find((f) => f.name === 'exemplar');\n\n if (getFieldLinks) {\n exemplars?.fields.forEach((field, index) => {\n exemplars.fields[index].getLinks = getFieldLinks(exemplars, field);\n });\n }\n\n if (options.calculate) {\n if (config.featureToggles.transformationsVariableSupport) {\n const optionsCopy = {\n ...options,\n calculation: {\n xBuckets: { ...options.calculation?.xBuckets } ?? undefined,\n yBuckets: { ...options.calculation?.yBuckets } ?? undefined,\n },\n };\n\n if (optionsCopy.calculation?.xBuckets?.value && replaceVariables !== undefined) {\n optionsCopy.calculation.xBuckets.value = replaceVariables(optionsCopy.calculation.xBuckets.value);\n }\n\n if (optionsCopy.calculation?.yBuckets?.value && replaceVariables !== undefined) {\n optionsCopy.calculation.yBuckets.value = replaceVariables(optionsCopy.calculation.yBuckets.value);\n }\n\n return getDenseHeatmapData(\n calculateHeatmapFromData(frames, optionsCopy.calculation ?? {}),\n exemplars,\n optionsCopy,\n palette,\n theme\n );\n }\n\n return getDenseHeatmapData(\n calculateHeatmapFromData(frames, options.calculation ?? {}),\n exemplars,\n options,\n palette,\n theme\n );\n }\n\n // Check for known heatmap types\n let rowsHeatmap: DataFrame | undefined = undefined;\n for (const frame of frames) {\n switch (frame.meta?.type) {\n case DataFrameType.HeatmapCells:\n return isHeatmapCellsDense(frame)\n ? getDenseHeatmapData(frame, exemplars, options, palette, theme)\n : getSparseHeatmapData(frame, exemplars, options, palette, theme);\n\n case DataFrameType.HeatmapRows:\n rowsHeatmap = frame; // the default format\n }\n }\n\n // Everything past here assumes a field for each row in the heatmap (buckets)\n if (!rowsHeatmap) {\n if (frames.length > 1) {\n let allNamesNumeric = frames.every(\n (frame) => !Number.isNaN(parseSampleValue(frame.fields[1].state?.displayName!))\n );\n\n if (allNamesNumeric) {\n frames.sort(sortSeriesByLabel);\n }\n\n rowsHeatmap = [\n outerJoinDataFrames({\n frames,\n })!,\n ][0];\n } else {\n let frame = frames[0];\n let numberFields = frame.fields.filter((field) => field.type === FieldType.number);\n let allNamesNumeric = numberFields.every((field) => !Number.isNaN(parseSampleValue(field.state?.displayName!)));\n\n if (allNamesNumeric) {\n numberFields.sort((a, b) => parseSampleValue(a.state?.displayName!) - parseSampleValue(b.state?.displayName!));\n\n rowsHeatmap = {\n ...frame,\n fields: [frame.fields.find((f) => f.type === FieldType.time)!, ...numberFields],\n };\n } else {\n rowsHeatmap = frame;\n }\n }\n }\n\n return getDenseHeatmapData(\n rowsToCellsHeatmap({\n unit: options.yAxis?.unit, // used to format the ordinal lookup values\n decimals: options.yAxis?.decimals,\n ...options.rowsFrame,\n frame: rowsHeatmap,\n }),\n exemplars,\n options,\n palette,\n theme\n );\n}\n\nconst getSparseHeatmapData = (\n frame: DataFrame,\n exemplars: DataFrame | undefined,\n options: Options,\n palette: string[],\n theme: GrafanaTheme2\n): HeatmapData => {\n if (frame.meta?.type !== DataFrameType.HeatmapCells || isHeatmapCellsDense(frame)) {\n return {\n warning: 'Expected sparse heatmap format',\n heatmap: frame,\n };\n }\n\n // y axis tick label display\n updateFieldDisplay(frame.fields[1], options.yAxis, theme);\n\n const valueField = frame.fields[3];\n\n // cell value display\n const disp = updateFieldDisplay(valueField, options.cellValues, theme);\n\n let [minValue, maxValue] = boundedMinMax(\n valueField.values,\n options.color.min,\n options.color.max,\n options.filterValues?.le,\n options.filterValues?.ge\n );\n\n return {\n heatmap: frame,\n heatmapColors: {\n palette,\n values: valuesToFills(valueField.values, palette, minValue, maxValue),\n minValue,\n maxValue,\n },\n exemplars,\n display: (v) => formattedValueToString(disp(v)),\n };\n};\n\nconst getDenseHeatmapData = (\n frame: DataFrame,\n exemplars: DataFrame | undefined,\n options: Options,\n palette: string[],\n theme: GrafanaTheme2\n): HeatmapData => {\n if (frame.meta?.type !== DataFrameType.HeatmapCells) {\n return {\n warning: 'Expected heatmap scanlines format',\n heatmap: frame,\n };\n }\n\n if (frame.fields.length < 2 || frame.length < 2) {\n return { heatmap: frame };\n }\n\n const meta = readHeatmapRowsCustomMeta(frame);\n let xName: string | undefined = undefined;\n let yName: string | undefined = undefined;\n let valueField: Field | undefined = undefined;\n\n // validate field display properties\n for (const field of frame.fields) {\n switch (field.name) {\n case 'y':\n yName = field.name;\n\n case 'yMin':\n case 'yMax': {\n if (!yName) {\n yName = field.name;\n }\n if (meta.yOrdinalDisplay == null) {\n updateFieldDisplay(field, options.yAxis, theme);\n }\n break;\n }\n\n case 'x':\n case 'xMin':\n case 'xMax':\n xName = field.name;\n break;\n\n default: {\n if (field.type === FieldType.number && !valueField) {\n valueField = field;\n }\n }\n }\n }\n\n if (!yName) {\n return { warning: 'Missing Y field', heatmap: frame };\n }\n if (!yName) {\n return { warning: 'Missing X field', heatmap: frame };\n }\n if (!valueField) {\n return { warning: 'Missing value field', heatmap: frame };\n }\n\n const disp = updateFieldDisplay(valueField, options.cellValues, theme);\n\n // infer bucket sizes from data (for now)\n // the 'heatmap-scanlines' dense frame format looks like:\n // x: 1,1,1,1,2,2,2,2\n // y: 3,4,5,6,3,4,5,6\n // count: 0,0,0,7,0,3,0,1\n\n const xs = frame.fields[0].values;\n const ys = frame.fields[1].values;\n const dlen = xs.length;\n\n // below is literally copy/paste from the pathBuilder code in utils.ts\n // detect x and y bin qtys by detecting layout repetition in x & y data\n let yBinQty = dlen - ys.lastIndexOf(ys[0]);\n let xBinQty = dlen / yBinQty;\n let yBinIncr = ys[1] - ys[0];\n let xBinIncr = xs[yBinQty] - xs[0];\n\n let [minValue, maxValue] = boundedMinMax(\n valueField.values,\n options.color.min,\n options.color.max,\n options.filterValues?.le,\n options.filterValues?.ge\n );\n\n let calcX = options.calculation?.xBuckets;\n let calcY = options.calculation?.yBuckets;\n\n const data: HeatmapData = {\n heatmap: frame,\n heatmapColors: {\n palette,\n values: valuesToFills(valueField.values, palette, minValue, maxValue),\n minValue,\n maxValue,\n },\n\n exemplars: exemplars?.length ? exemplars : undefined,\n xBucketSize: xBinIncr,\n yBucketSize: yBinIncr,\n xBucketCount: xBinQty,\n yBucketCount: yBinQty,\n\n yLog: calcY?.scale?.log ?? 0,\n xLog: calcX?.scale?.log ?? 0,\n\n xLogSplit: calcX?.scale?.log ? +(calcX?.value ?? '1') : 1,\n yLogSplit: calcY?.scale?.log ? +(calcY?.value ?? '1') : 1,\n\n // TODO: improve heuristic\n xLayout:\n xName === 'xMax' ? HeatmapCellLayout.le : xName === 'xMin' ? HeatmapCellLayout.ge : HeatmapCellLayout.unknown,\n yLayout:\n yName === 'yMax' ? HeatmapCellLayout.le : yName === 'yMin' ? HeatmapCellLayout.ge : HeatmapCellLayout.unknown,\n\n display: (v) => formattedValueToString(disp(v)),\n };\n\n return data;\n};\n\nfunction updateFieldDisplay(field: Field, opts: CellValues | undefined, theme: GrafanaTheme2): ValueFormatter {\n if (opts?.unit?.length || opts?.decimals != null) {\n const { unit, decimals } = opts;\n field.display = undefined;\n field.config = { ...field.config };\n if (unit?.length) {\n field.config.unit = unit;\n }\n if (decimals != null) {\n field.config.decimals = decimals;\n }\n }\n if (!field.display) {\n field.display = getDisplayProcessor({ field, theme });\n }\n return field.display;\n}\n","import * as d3 from 'd3';\nimport * as d3ScaleChromatic from 'd3-scale-chromatic';\nimport tinycolor from 'tinycolor2';\n\nimport { GrafanaTheme2 } from '@grafana/data';\n\nimport { HeatmapColorOptions, defaultOptions, HeatmapColorMode, HeatmapColorScale } from './types';\n\n// https://observablehq.com/@d3/color-schemes?collection=@d3/d3-scale-chromatic\n\n// the previous heatmap panel used d3 deps and some code to interpolate to static 9-color palettes. here we just hard-code them for clarity.\n// if the need arises for configurable-sized palettes, we can bring back the deps & variable interpolation (see simplified code at end)\n\n// Schemes from d3-scale-chromatic\n// https://github.com/d3/d3-scale-chromatic\nexport const colorSchemes = [\n // Diverging\n { name: 'BrBG', invert: 'always' },\n { name: 'PiYG', invert: 'always' },\n { name: 'PRGn', invert: 'always' },\n { name: 'PuOr', invert: 'always' },\n { name: 'RdBu', invert: 'always' },\n { name: 'RdGy', invert: 'always' },\n { name: 'RdYlBu', invert: 'always' },\n { name: 'RdYlGn', invert: 'always' },\n { name: 'Spectral', invert: 'always' },\n\n // Sequential (Single Hue)\n { name: 'Blues', invert: 'dark' },\n { name: 'Greens', invert: 'dark' },\n { name: 'Greys', invert: 'dark' },\n { name: 'Oranges', invert: 'dark' },\n { name: 'Purples', invert: 'dark' },\n { name: 'Reds', invert: 'dark' },\n\n // Sequential (Multi-Hue)\n { name: 'Turbo', invert: 'light' },\n { name: 'Cividis', invert: 'light' },\n { name: 'Viridis', invert: 'light' },\n { name: 'Magma', invert: 'light' },\n { name: 'Inferno', invert: 'light' },\n { name: 'Plasma', invert: 'light' },\n { name: 'Warm', invert: 'light' },\n { name: 'Cool', invert: 'light' },\n { name: 'Cubehelix', invert: 'light', name2: 'CubehelixDefault' },\n { name: 'BuGn', invert: 'dark' },\n { name: 'BuPu', invert: 'dark' },\n { name: 'GnBu', invert: 'dark' },\n { name: 'OrRd', invert: 'dark' },\n { name: 'PuBuGn', invert: 'dark' },\n { name: 'PuBu', invert: 'dark' },\n { name: 'PuRd', invert: 'dark' },\n { name: 'RdPu', invert: 'dark' },\n { name: 'YlGnBu', invert: 'dark' },\n { name: 'YlGn', invert: 'dark' },\n { name: 'YlOrBr', invert: 'dark' },\n { name: 'YlOrRd', invert: 'dark' },\n\n // Cyclical\n { name: 'Rainbow', invert: 'always' },\n { name: 'Sinebow', invert: 'always' },\n];\n\ntype Interpolator = (t: number) => string;\n\nconst DEFAULT_SCHEME = colorSchemes.find((scheme) => scheme.name === 'Spectral');\n\nexport function quantizeScheme(opts: HeatmapColorOptions, theme: GrafanaTheme2): string[] {\n const options = { ...defaultOptions.color, ...opts };\n const palette = [];\n const steps = (options.steps ?? 128) - 1;\n\n if (opts.mode === HeatmapColorMode.Opacity) {\n const fill = tinycolor(theme.visualization.getColorByName(opts.fill)).toPercentageRgb();\n\n const scale =\n options.scale === HeatmapColorScale.Exponential\n ? d3.scalePow().exponent(options.exponent).domain([0, 1]).range([0, 1])\n : d3.scaleLinear().domain([0, 1]).range([0, 1]);\n\n for (let i = 0; i <= steps; i++) {\n fill.a = scale(i / steps);\n palette.push(tinycolor(fill).toString('hex8'));\n }\n } else {\n const scheme = colorSchemes.find((scheme) => scheme.name === options.scheme) ?? DEFAULT_SCHEME!;\n let fnName = 'interpolate' + (scheme.name2 ?? scheme.name);\n const interpolate: Interpolator = (d3ScaleChromatic as any)[fnName];\n\n for (let i = 0; i <= steps; i++) {\n let rgbStr = interpolate(i / steps);\n let rgb =\n rgbStr.indexOf('rgb') === 0\n ? '#' + [...rgbStr.matchAll(/\\d+/g)].map((v) => (+v[0]).toString(16).padStart(2, '0')).join('')\n : rgbStr;\n palette.push(rgb);\n }\n\n if (\n scheme.invert === 'always' ||\n (scheme.invert === 'dark' && theme.isDark) ||\n (scheme.invert === 'light' && theme.isLight)\n ) {\n palette.reverse();\n }\n\n if (opts.reverse) {\n palette.reverse();\n }\n }\n\n return palette;\n}\n","import { css } from '@emotion/css';\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\n\nimport {\n DashboardCursorSync,\n DataFrame,\n DataFrameType,\n Field,\n getLinksSupplier,\n GrafanaTheme2,\n PanelProps,\n ScopedVars,\n TimeRange,\n} from '@grafana/data';\nimport { config, PanelDataErrorView } from '@grafana/runtime';\nimport { ScaleDistributionConfig } from '@grafana/schema';\nimport {\n Portal,\n ScaleDistribution,\n TooltipPlugin2,\n TooltipDisplayMode,\n ZoomPlugin,\n UPlotChart,\n usePanelContext,\n useStyles2,\n useTheme2,\n VizLayout,\n VizTooltipContainer,\n} from '@grafana/ui';\nimport { TimeRange2, TooltipHoverMode } from '@grafana/ui/src/components/uPlot/plugins/TooltipPlugin2';\nimport { ColorScale } from 'app/core/components/ColorScale/ColorScale';\nimport { isHeatmapCellsDense, readHeatmapRowsCustomMeta } from 'app/features/transformers/calculateHeatmap/heatmap';\n\nimport { AnnotationsPlugin2 } from '../timeseries/plugins/AnnotationsPlugin2';\n\nimport { ExemplarModalHeader } from './ExemplarModalHeader';\nimport { HeatmapHoverView } from './HeatmapHoverView';\nimport { HeatmapHoverView as HeatmapHoverViewOld } from './HeatmapHoverViewOld';\nimport { prepareHeatmapData } from './fields';\nimport { quantizeScheme } from './palettes';\nimport { Options } from './types';\nimport { HeatmapHoverEvent, prepConfig } from './utils';\n\ninterface HeatmapPanelProps extends PanelProps {}\n\nexport const HeatmapPanel = ({\n data,\n id,\n timeRange,\n timeZone,\n width,\n height,\n options,\n fieldConfig,\n eventBus,\n onChangeTimeRange,\n replaceVariables,\n}: HeatmapPanelProps) => {\n const theme = useTheme2();\n const styles = useStyles2(getStyles);\n const { sync, canAddAnnotations } = usePanelContext();\n\n // temp range set for adding new annotation set by TooltipPlugin2, consumed by AnnotationPlugin2\n const [newAnnotationRange, setNewAnnotationRange] = useState(null);\n\n // necessary for enabling datalinks in hover view\n let scopedVarsFromRawData: ScopedVars[] = [];\n for (const series of data.series) {\n for (const field of series.fields) {\n if (field.state?.scopedVars) {\n scopedVarsFromRawData.push(field.state.scopedVars);\n }\n }\n }\n\n // ugh\n let timeRangeRef = useRef(timeRange);\n timeRangeRef.current = timeRange;\n\n const getFieldLinksSupplier = useCallback(\n (exemplars: DataFrame, field: Field) => {\n return getLinksSupplier(exemplars, field, field.state?.scopedVars ?? {}, replaceVariables);\n },\n [replaceVariables]\n );\n\n const palette = useMemo(() => quantizeScheme(options.color, theme), [options.color, theme]);\n\n const info = useMemo(() => {\n try {\n return prepareHeatmapData(\n data.series,\n data.annotations,\n options,\n palette,\n theme,\n getFieldLinksSupplier,\n replaceVariables\n );\n } catch (ex) {\n return { warning: `${ex}` };\n }\n }, [data.series, data.annotations, options, palette, theme, getFieldLinksSupplier, replaceVariables]);\n\n const facets = useMemo(() => {\n let exemplarsXFacet: number[] | undefined = []; // \"Time\" field\n let exemplarsYFacet: Array = [];\n\n const meta = readHeatmapRowsCustomMeta(info.heatmap);\n if (info.exemplars?.length) {\n exemplarsXFacet = info.exemplars?.fields[0].values;\n\n // render by match on ordinal y label\n if (meta.yMatchWithLabel) {\n // ordinal/labeled heatmap-buckets?\n const hasLabeledY = meta.yOrdinalDisplay != null;\n\n if (hasLabeledY) {\n let matchExemplarsBy = info.exemplars?.fields.find((field) => field.name === meta.yMatchWithLabel)!.values;\n exemplarsYFacet = matchExemplarsBy.map((label) => meta.yOrdinalLabel?.indexOf(label));\n } else {\n exemplarsYFacet = info.exemplars?.fields[1].values; // \"Value\" field\n }\n }\n // render by raw value\n else {\n exemplarsYFacet = info.exemplars?.fields[1].values; // \"Value\" field\n }\n }\n\n return [null, info.heatmap?.fields.map((f) => f.values), [exemplarsXFacet, exemplarsYFacet]];\n }, [info.heatmap, info.exemplars]);\n\n const [hover, setHover] = useState(undefined);\n const [shouldDisplayCloseButton, setShouldDisplayCloseButton] = useState(false);\n const isToolTipOpen = useRef(false);\n\n const onCloseToolTip = () => {\n isToolTipOpen.current = false;\n setShouldDisplayCloseButton(false);\n onhover(null);\n };\n\n const onclick = () => {\n isToolTipOpen.current = !isToolTipOpen.current;\n\n // Linking into useState required to re-render tooltip\n setShouldDisplayCloseButton(isToolTipOpen.current);\n };\n\n const onhover = useCallback(\n (evt?: HeatmapHoverEvent | null) => {\n setHover(evt ?? undefined);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [options, data.structureRev]\n );\n\n // ugh\n const dataRef = useRef(info);\n dataRef.current = info;\n const showNewVizTooltips =\n config.featureToggles.newVizTooltips && (sync == null || sync() !== DashboardCursorSync.Tooltip);\n\n const builder = useMemo(() => {\n const scaleConfig: ScaleDistributionConfig = dataRef.current?.heatmap?.fields[1].config?.custom?.scaleDistribution;\n\n return prepConfig({\n dataRef,\n theme,\n eventBus,\n onhover: !showNewVizTooltips ? onhover : null,\n onclick: !showNewVizTooltips && options.tooltip.mode !== TooltipDisplayMode.None ? onclick : null,\n isToolTipOpen,\n timeZone,\n getTimeRange: () => timeRangeRef.current,\n sync,\n cellGap: options.cellGap,\n hideLE: options.filterValues?.le,\n hideGE: options.filterValues?.ge,\n exemplarColor: options.exemplars?.color ?? 'rgba(255,0,255,0.7)',\n yAxisConfig: options.yAxis,\n ySizeDivisor: scaleConfig?.type === ScaleDistribution.Log ? +(options.calculation?.yBuckets?.value || 1) : 1,\n });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [options, timeZone, data.structureRev]);\n\n const renderLegend = () => {\n if (!info.heatmap || !options.legend.show) {\n return null;\n }\n\n let heatmapType = dataRef.current?.heatmap?.meta?.type;\n let isSparseHeatmap = heatmapType === DataFrameType.HeatmapCells && !isHeatmapCellsDense(dataRef.current?.heatmap!);\n let countFieldIdx = !isSparseHeatmap ? 2 : 3;\n const countField = info.heatmap.fields[countFieldIdx];\n\n let hoverValue: number | undefined = undefined;\n // seriesIdx: 1 is heatmap layer; 2 is exemplar layer\n if (hover && info.heatmap.fields && hover.seriesIdx === 1) {\n hoverValue = countField.values[hover.dataIdx];\n }\n\n return (\n \n
\n \n
\n
\n );\n };\n\n if (info.warning || !info.heatmap) {\n return (\n \n );\n }\n\n const enableAnnotationCreation = Boolean(canAddAnnotations && canAddAnnotations());\n\n return (\n <>\n \n {(vizWidth: number, vizHeight: number) => (\n \n {!showNewVizTooltips && }\n {showNewVizTooltips && (\n <>\n {options.tooltip.mode !== TooltipDisplayMode.None && (\n {\n if (viaSync) {\n return null;\n }\n\n if (enableAnnotationCreation && timeRange2 != null) {\n setNewAnnotationRange(timeRange2);\n dismiss();\n return;\n }\n\n const annotate = () => {\n let xVal = u.posToVal(u.cursor.left!, 'x');\n\n setNewAnnotationRange({ from: xVal, to: xVal });\n dismiss();\n };\n\n return (\n \n );\n }}\n maxWidth={options.tooltip.maxWidth}\n maxHeight={options.tooltip.maxHeight}\n />\n )}\n \n \n )}\n \n )}\n \n {!showNewVizTooltips && (\n <>\n \n {hover && options.tooltip.mode !== TooltipDisplayMode.None && (\n \n {shouldDisplayCloseButton && }\n \n \n )}\n \n \n )}\n \n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n colorScaleWrapper: css({\n marginLeft: '25px',\n padding: '10px 0',\n maxWidth: '300px',\n }),\n});\n","import { FieldConfigSource, PanelModel, PanelTypeChangedHandler } from '@grafana/data';\nimport {\n AxisPlacement,\n ScaleDistribution,\n VisibilityMode,\n HeatmapCellLayout,\n HeatmapCalculationMode,\n HeatmapCalculationOptions,\n} from '@grafana/schema';\nimport { TooltipDisplayMode } from '@grafana/ui';\n\nimport { colorSchemes } from './palettes';\nimport { Options, defaultOptions, HeatmapColorMode } from './types';\n\n/** Called when the version number changes */\nexport const heatmapMigrationHandler = (panel: PanelModel): Partial => {\n // Migrating from angular\n if (Object.keys(panel.options ?? {}).length === 0) {\n return heatmapChangedHandler(panel, 'heatmap', { angular: panel }, panel.fieldConfig);\n }\n\n // multi tooltip mode in 10.3+\n let showTooltip = panel.options?.tooltip?.show;\n if (showTooltip !== undefined) {\n if (showTooltip === true) {\n panel.options.tooltip.mode = TooltipDisplayMode.Single;\n } else if (showTooltip === false) {\n panel.options.tooltip.mode = TooltipDisplayMode.None;\n }\n\n // Remove old tooltip option\n delete panel.options.tooltip?.show;\n }\n\n return panel.options;\n};\n\n/**\n * This is called when the panel changes from another panel\n */\nexport const heatmapChangedHandler: PanelTypeChangedHandler = (panel, prevPluginId, prevOptions, prevFieldConfig) => {\n if (prevPluginId === 'heatmap' && prevOptions.angular) {\n const { fieldConfig, options } = angularToReactHeatmap({\n ...prevOptions.angular,\n fieldConfig: prevFieldConfig,\n });\n panel.fieldConfig = fieldConfig; // Mutates the incoming panel\n return options;\n }\n // alpha for 8.5+, then beta at 9.0.1\n if (prevPluginId === 'heatmap-new') {\n const { bucketFrame, ...options } = panel.options;\n if (bucketFrame) {\n return { ...options, rowsFrame: bucketFrame };\n }\n return panel.options;\n }\n return {};\n};\n\nexport function angularToReactHeatmap(angular: any): { fieldConfig: FieldConfigSource; options: Options } {\n const fieldConfig: FieldConfigSource = {\n defaults: {},\n overrides: [],\n };\n\n const calculate = angular.dataFormat === 'tsbuckets' ? false : true;\n const calculation: HeatmapCalculationOptions = {\n ...defaultOptions.calculation,\n };\n\n const oldYAxis = { logBase: 1, ...angular.yAxis };\n\n if (calculate) {\n if (angular.xBucketSize) {\n calculation.xBuckets = { mode: HeatmapCalculationMode.Size, value: `${angular.xBucketSize}` };\n } else if (angular.xBucketNumber) {\n calculation.xBuckets = { mode: HeatmapCalculationMode.Count, value: `${angular.xBucketNumber}` };\n }\n\n if (angular.yBucketSize) {\n calculation.yBuckets = { mode: HeatmapCalculationMode.Size, value: `${angular.yBucketSize}` };\n } else if (angular.xBucketNumber) {\n calculation.yBuckets = { mode: HeatmapCalculationMode.Count, value: `${angular.yBucketNumber}` };\n }\n\n if (oldYAxis.logBase > 1) {\n calculation.yBuckets = {\n mode: HeatmapCalculationMode.Count,\n value: +oldYAxis.splitFactor > 0 ? `${oldYAxis.splitFactor}` : undefined,\n scale: {\n type: ScaleDistribution.Log,\n log: oldYAxis.logBase,\n },\n };\n }\n }\n\n const cellGap = asNumber(angular.cards?.cardPadding, 2);\n const options: Options = {\n calculate,\n calculation,\n color: {\n ...defaultOptions.color,\n steps: 128, // best match with existing colors\n },\n cellGap: cellGap ? cellGap : 1, // default to size 1\n cellRadius: asNumber(angular.cards?.cardRound), // just to keep it\n yAxis: {\n axisPlacement: oldYAxis.show === false ? AxisPlacement.Hidden : AxisPlacement.Left,\n reverse: Boolean(angular.reverseYBuckets),\n axisWidth: asNumber(oldYAxis.width),\n min: oldYAxis.min,\n max: oldYAxis.max,\n unit: oldYAxis.format,\n decimals: oldYAxis.decimals,\n },\n cellValues: {\n decimals: asNumber(angular.tooltipDecimals),\n },\n rowsFrame: {\n layout: getHeatmapCellLayout(angular.yBucketBound),\n },\n legend: {\n show: Boolean(angular.legend?.show),\n },\n showValue: VisibilityMode.Never,\n tooltip: {\n mode: Boolean(angular.tooltip?.show) ? TooltipDisplayMode.Single : TooltipDisplayMode.None,\n yHistogram: Boolean(angular.tooltip?.showHistogram),\n },\n exemplars: {\n ...defaultOptions.exemplars,\n },\n };\n\n if (angular.hideZeroBuckets) {\n options.filterValues = { ...defaultOptions.filterValues }; // min: 1e-9\n }\n\n // Migrate color options\n const color = angular.color ?? {};\n switch (color?.mode) {\n case 'spectrum': {\n options.color.mode = HeatmapColorMode.Scheme;\n\n const current: string = color.colorScheme;\n let scheme = colorSchemes.find((v) => v.name === current);\n if (!scheme) {\n scheme = colorSchemes.find((v) => current.indexOf(v.name) >= 0);\n }\n options.color.scheme = scheme ? scheme.name : defaultOptions.color.scheme;\n break;\n }\n case 'opacity': {\n options.color.mode = HeatmapColorMode.Opacity;\n options.color.scale = color.scale;\n break;\n }\n }\n options.color.fill = color.cardColor;\n options.color.min = color.min;\n options.color.max = color.max;\n\n if (typeof color.min === 'number' && typeof color.max === 'number' && color.min > color.max) {\n options.color.min = color.max;\n options.color.max = color.min;\n options.color.reverse = true;\n }\n\n return { fieldConfig, options };\n}\n\nfunction getHeatmapCellLayout(v?: string): HeatmapCellLayout {\n switch (v) {\n case 'upper':\n return HeatmapCellLayout.ge;\n case 'lower':\n return HeatmapCellLayout.le;\n case 'middle':\n return HeatmapCellLayout.unknown;\n }\n return HeatmapCellLayout.auto;\n}\n\nfunction asNumber(v: unknown, defaultValue?: number): number | undefined {\n if (v == null || v === '') {\n return defaultValue;\n }\n const num = +v;\n return isNaN(num) ? defaultValue : num;\n}\n","import { VisualizationSuggestionsBuilder } from '@grafana/data';\nimport { config } from '@grafana/runtime';\n\nimport { prepareHeatmapData } from './fields';\nimport { quantizeScheme } from './palettes';\nimport { Options, defaultOptions } from './types';\n\nexport class HeatmapSuggestionsSupplier {\n getSuggestionsForData(builder: VisualizationSuggestionsBuilder) {\n const { dataSummary } = builder;\n\n if (\n !builder.data?.series ||\n !dataSummary.hasData ||\n dataSummary.timeFieldCount < 1 ||\n dataSummary.numberFieldCount < 2 ||\n dataSummary.numberFieldCount > 10\n ) {\n return;\n }\n\n const palette = quantizeScheme(defaultOptions.color, config.theme2);\n const info = prepareHeatmapData(builder.data.series, undefined, defaultOptions, palette, config.theme2);\n if (!info || info.warning) {\n return;\n }\n\n builder.getListAppender({\n name: '',\n pluginId: 'heatmap',\n options: {},\n fieldConfig: {\n defaults: {\n custom: {},\n },\n overrides: [],\n },\n });\n }\n}\n","import React from 'react';\n\nimport { FieldConfigProperty, FieldType, identityOverrideProcessor, PanelPlugin } from '@grafana/data';\nimport { config } from '@grafana/runtime';\nimport {\n AxisPlacement,\n GraphFieldConfig,\n ScaleDistribution,\n ScaleDistributionConfig,\n HeatmapCellLayout,\n} from '@grafana/schema';\nimport { TooltipDisplayMode } from '@grafana/ui';\nimport { addHideFrom, ScaleDistributionEditor } from '@grafana/ui/src/options/builder';\nimport { ColorScale } from 'app/core/components/ColorScale/ColorScale';\nimport { addHeatmapCalculationOptions } from 'app/features/transformers/calculateHeatmap/editor/helper';\nimport { readHeatmapRowsCustomMeta } from 'app/features/transformers/calculateHeatmap/heatmap';\n\nimport { HeatmapPanel } from './HeatmapPanel';\nimport { prepareHeatmapData } from './fields';\nimport { heatmapChangedHandler, heatmapMigrationHandler } from './migrations';\nimport { colorSchemes, quantizeScheme } from './palettes';\nimport { HeatmapSuggestionsSupplier } from './suggestions';\nimport { Options, defaultOptions, HeatmapColorMode, HeatmapColorScale } from './types';\n\nexport const plugin = new PanelPlugin(HeatmapPanel)\n .useFieldConfig({\n disableStandardOptions: Object.values(FieldConfigProperty).filter((v) => v !== FieldConfigProperty.Links),\n useCustomConfig: (builder) => {\n builder.addCustomEditor({\n id: 'scaleDistribution',\n path: 'scaleDistribution',\n name: 'Y axis scale',\n category: ['Heatmap'],\n editor: ScaleDistributionEditor,\n override: ScaleDistributionEditor,\n defaultValue: { type: ScaleDistribution.Linear },\n shouldApply: (f) => f.type === FieldType.number,\n process: identityOverrideProcessor,\n hideFromDefaults: true,\n });\n addHideFrom(builder); // for tooltip etc\n },\n })\n .setPanelChangeHandler(heatmapChangedHandler)\n .setMigrationHandler(heatmapMigrationHandler)\n .setPanelOptions((builder, context) => {\n const opts = context.options ?? defaultOptions;\n\n let isOrdinalY = false;\n\n if (context.data.length > 0) {\n try {\n // NOTE: this feels like overkill/expensive just to assert if we have an ordinal y\n // can probably simplify without doing full dataprep\n const palette = quantizeScheme(opts.color, config.theme2);\n const v = prepareHeatmapData(\n context.data,\n undefined,\n opts,\n palette,\n config.theme2,\n undefined,\n context.replaceVariables\n );\n isOrdinalY = readHeatmapRowsCustomMeta(v.heatmap).yOrdinalDisplay != null;\n } catch {}\n }\n\n let category = ['Heatmap'];\n\n builder.addRadio({\n path: 'calculate',\n name: 'Calculate from data',\n defaultValue: defaultOptions.calculate,\n category,\n settings: {\n options: [\n { label: 'Yes', value: true },\n { label: 'No', value: false },\n ],\n },\n });\n\n if (opts.calculate) {\n addHeatmapCalculationOptions('calculation.', builder, opts.calculation, category);\n }\n\n category = ['Y Axis'];\n\n builder\n .addRadio({\n path: 'yAxis.axisPlacement',\n name: 'Placement',\n defaultValue: defaultOptions.yAxis.axisPlacement ?? AxisPlacement.Left,\n category,\n settings: {\n options: [\n { label: 'Left', value: AxisPlacement.Left },\n { label: 'Right', value: AxisPlacement.Right },\n { label: 'Hidden', value: AxisPlacement.Hidden },\n ],\n },\n })\n .addUnitPicker({\n category,\n path: 'yAxis.unit',\n name: 'Unit',\n defaultValue: undefined,\n settings: {\n isClearable: true,\n },\n })\n .addNumberInput({\n category,\n path: 'yAxis.decimals',\n name: 'Decimals',\n settings: {\n placeholder: 'Auto',\n },\n });\n\n if (!isOrdinalY) {\n // if undefined, then show the min+max\n builder\n .addNumberInput({\n path: 'yAxis.min',\n name: 'Min value',\n settings: {\n placeholder: 'Auto',\n },\n category,\n })\n .addTextInput({\n path: 'yAxis.max',\n name: 'Max value',\n settings: {\n placeholder: 'Auto',\n },\n category,\n });\n }\n\n builder\n .addNumberInput({\n path: 'yAxis.axisWidth',\n name: 'Axis width',\n defaultValue: defaultOptions.yAxis.axisWidth,\n settings: {\n placeholder: 'Auto',\n min: 5, // smaller should just be hidden\n },\n category,\n })\n .addTextInput({\n path: 'yAxis.axisLabel',\n name: 'Axis label',\n defaultValue: defaultOptions.yAxis.axisLabel,\n settings: {\n placeholder: 'Auto',\n },\n category,\n });\n\n if (!opts.calculate) {\n builder.addRadio({\n path: 'rowsFrame.layout',\n name: 'Tick alignment',\n defaultValue: defaultOptions.rowsFrame?.layout ?? HeatmapCellLayout.auto,\n category,\n settings: {\n options: [\n { label: 'Auto', value: HeatmapCellLayout.auto },\n { label: 'Top (LE)', value: HeatmapCellLayout.le },\n { label: 'Middle', value: HeatmapCellLayout.unknown },\n { label: 'Bottom (GE)', value: HeatmapCellLayout.ge },\n ],\n },\n });\n }\n builder.addBooleanSwitch({\n path: 'yAxis.reverse',\n name: 'Reverse',\n defaultValue: defaultOptions.yAxis.reverse === true,\n category,\n });\n\n category = ['Colors'];\n\n builder.addRadio({\n path: `color.mode`,\n name: 'Mode',\n defaultValue: defaultOptions.color.mode,\n category,\n settings: {\n options: [\n { label: 'Scheme', value: HeatmapColorMode.Scheme },\n { label: 'Opacity', value: HeatmapColorMode.Opacity },\n ],\n },\n });\n\n builder.addColorPicker({\n path: `color.fill`,\n name: 'Color',\n defaultValue: defaultOptions.color.fill,\n category,\n showIf: (opts) => opts.color.mode === HeatmapColorMode.Opacity,\n });\n\n builder.addRadio({\n path: `color.scale`,\n name: 'Scale',\n defaultValue: defaultOptions.color.scale,\n category,\n settings: {\n options: [\n { label: 'Exponential', value: HeatmapColorScale.Exponential },\n { label: 'Linear', value: HeatmapColorScale.Linear },\n ],\n },\n showIf: (opts) => opts.color.mode === HeatmapColorMode.Opacity,\n });\n\n builder.addSliderInput({\n path: 'color.exponent',\n name: 'Exponent',\n defaultValue: defaultOptions.color.exponent,\n category,\n settings: {\n min: 0.1, // 1 for on/off?\n max: 2,\n step: 0.1,\n },\n showIf: (opts) =>\n opts.color.mode === HeatmapColorMode.Opacity && opts.color.scale === HeatmapColorScale.Exponential,\n });\n\n builder.addSelect({\n path: `color.scheme`,\n name: 'Scheme',\n description: '',\n defaultValue: defaultOptions.color.scheme,\n category,\n settings: {\n options: colorSchemes.map((scheme) => ({\n value: scheme.name,\n label: scheme.name,\n //description: 'Set a geometry field based on the results of other fields',\n })),\n },\n showIf: (opts) => opts.color.mode !== HeatmapColorMode.Opacity,\n });\n\n builder\n .addSliderInput({\n path: 'color.steps',\n name: 'Steps',\n defaultValue: defaultOptions.color.steps,\n category,\n settings: {\n min: 2,\n max: 128,\n step: 1,\n },\n })\n .addBooleanSwitch({\n path: 'color.reverse',\n name: 'Reverse',\n defaultValue: defaultOptions.color.reverse,\n category,\n })\n .addCustomEditor({\n id: '__scale__',\n path: `__scale__`,\n name: '',\n category,\n editor: () => {\n const palette = quantizeScheme(opts.color, config.theme2);\n return (\n
\n \n
\n );\n },\n });\n\n builder\n .addNumberInput({\n path: 'color.min',\n name: 'Start color scale from value',\n defaultValue: defaultOptions.color.min,\n settings: {\n placeholder: 'Auto (min)',\n },\n category,\n })\n .addNumberInput({\n path: 'color.max',\n name: 'End color scale at value',\n defaultValue: defaultOptions.color.max,\n settings: {\n placeholder: 'Auto (max)',\n },\n category,\n });\n\n category = ['Cell display'];\n\n if (!opts.calculate) {\n builder.addTextInput({\n path: 'rowsFrame.value',\n name: 'Value name',\n defaultValue: defaultOptions.rowsFrame?.value,\n settings: {\n placeholder: 'Value',\n },\n category,\n });\n }\n\n builder\n .addUnitPicker({\n category,\n path: 'cellValues.unit',\n name: 'Unit',\n defaultValue: undefined,\n settings: {\n isClearable: true,\n },\n })\n .addNumberInput({\n category,\n path: 'cellValues.decimals',\n name: 'Decimals',\n settings: {\n placeholder: 'Auto',\n },\n });\n\n builder\n // .addRadio({\n // path: 'showValue',\n // name: 'Show values',\n // defaultValue: defaultOptions.showValue,\n // category,\n // settings: {\n // options: [\n // { value: VisibilityMode.Auto, label: 'Auto' },\n // { value: VisibilityMode.Always, label: 'Always' },\n // { value: VisibilityMode.Never, label: 'Never' },\n // ],\n // },\n // })\n .addSliderInput({\n name: 'Cell gap',\n path: 'cellGap',\n defaultValue: defaultOptions.cellGap,\n category,\n settings: {\n min: 0,\n max: 25,\n },\n })\n .addNumberInput({\n path: 'filterValues.le',\n name: 'Hide cells with values <=',\n defaultValue: defaultOptions.filterValues?.le,\n settings: {\n placeholder: 'None',\n },\n category,\n })\n .addNumberInput({\n path: 'filterValues.ge',\n name: 'Hide cells with values >=',\n defaultValue: defaultOptions.filterValues?.ge,\n settings: {\n placeholder: 'None',\n },\n category,\n });\n // .addSliderInput({\n // name: 'Cell radius',\n // path: 'cellRadius',\n // defaultValue: defaultOptions.cellRadius,\n // category,\n // settings: {\n // min: 0,\n // max: 100,\n // },\n // })\n\n category = ['Tooltip'];\n\n builder.addRadio({\n path: 'tooltip.mode',\n name: 'Tooltip mode',\n category,\n defaultValue: TooltipDisplayMode.Single,\n settings: {\n options: [\n { value: TooltipDisplayMode.Single, label: 'Single' },\n { value: TooltipDisplayMode.Multi, label: 'All' },\n { value: TooltipDisplayMode.None, label: 'Hidden' },\n ],\n },\n });\n\n builder.addBooleanSwitch({\n path: 'tooltip.yHistogram',\n name: 'Show histogram (Y axis)',\n defaultValue: defaultOptions.tooltip.yHistogram,\n category,\n showIf: (opts) => opts.tooltip.mode === TooltipDisplayMode.Single,\n });\n\n builder.addBooleanSwitch({\n path: 'tooltip.showColorScale',\n name: 'Show color scale',\n defaultValue: defaultOptions.tooltip.showColorScale,\n category,\n showIf: (opts) => opts.tooltip.mode === TooltipDisplayMode.Single && config.featureToggles.newVizTooltips,\n });\n\n builder.addNumberInput({\n path: 'tooltip.maxWidth',\n name: 'Max width',\n category,\n settings: {\n integer: true,\n },\n showIf: (options) => config.featureToggles.newVizTooltips && options.tooltip?.mode !== TooltipDisplayMode.None,\n });\n\n builder.addNumberInput({\n path: 'tooltip.maxHeight',\n name: 'Max height',\n category,\n settings: {\n integer: true,\n },\n showIf: (options) => config.featureToggles.newVizTooltips && options.tooltip?.mode !== TooltipDisplayMode.None,\n });\n\n category = ['Legend'];\n builder.addBooleanSwitch({\n path: 'legend.show',\n name: 'Show legend',\n defaultValue: defaultOptions.legend.show,\n category,\n });\n\n category = ['Exemplars'];\n builder.addColorPicker({\n path: 'exemplars.color',\n name: 'Color',\n defaultValue: defaultOptions.exemplars.color,\n category,\n });\n })\n .setSuggestionsSupplier(new HeatmapSuggestionsSupplier())\n .setDataSupport({ annotations: true });\n"],"names":["GRADIENT_STOPS","ColorScale","colorPalette","min","max","display","hoverValue","useStopsPercentage","colors","setColors","scaleHover","setScaleHover","percent","setPercent","theme","styles","getStyles","getGradientStops","onScaleMouseMove","event","divOffset","offsetWidth","normPercentage","scaleValue","onScaleMouseLeave","clampPercent100","colorArray","stops","colorCount","incr","per","color","gradientEnd","skip","gradientStops","i","v","renderHistogram","can","histCanWidth","histCanHeight","xVals","countVals","index","yBucketCount","histCtx","fromIdx","toIdx","maxCount","c","pHov","pRest","pctY","pctX","getHoverCellColor","data","colorIndex","cellColor","conversions","noPluralize","formatMilliseconds","milliseconds","value","unit","unitString","getFieldFromData","fieldType","isSparse","field","name","getSparseCellMinMax","fields","xMax","f","yMin","yMax","interval","HeatmapHoverView","props","DataHoverView","HeatmapHoverCell","dataIdxs","dataRef","showHistogram","isPinned","showColorScale","scopedVars","replaceVars","mode","annotate","xField","yField","countField","xDisp","tooltipTimeFormat","yVals","meta","yDisp","yBucketMin","yBucketMax","xBucketMin","xBucketMax","nonNumericOrdinalDisplay","contentItems","getYValueIndex","idx","yValueIdx","getData","yMinIdx","yMaxIdx","exp","getDisplayData","vals","count","getCountValue","label","getContentLabels","isMulti","fromToInt","xVal","val","visibleFields","links","linkLookup","appropriateScopedVars","scopedVar","link","key","histCssWidth","histCssHeight","headerLabel","customContent","VizTooltipHeader","VizTooltipContent","VizTooltipFooter","hover","renderYBucket","prepConfig","opts","eventBus","onhover","onclick","isToolTipOpen","timeZone","getTimeRange","cellGap","hideLE","hideGE","yAxisConfig","ySizeDivisor","sync","eventsScope","xScaleKey","xScaleUnit","isTime","pxRatio","heatmapType","exemplarFillColor","qt","hRect","builder","UPlotConfigBuilder","rect","u","el","e","xMin","r","payload","hoverEvent","clearEvent","pendingOnleave","sel","left","top","s","dataMin","dataMax","offset","incrs","yScale","yAxisReverse","isSparseHeatmap","shouldUseLogScale","isOrdinalY","yScaleKey","bucketFactor","scaleMin","scaleMax","yExp","log","explicitMin","explicitMax","minLog","maxLog","minExpanded","maxExpanded","bucketSize","dispY","decimals","self","splits","pathBuilder","heatmapPathsSparse","heatmapPathsDense","seriesIdx","dataIdx","x","y","xSize","ySize","heatmapPathsPoints","cursor","cx","cy","o","isHovered","type","src","w","h","CRISP_EDGES_GAP_MIN","disp","each","gap","xAlign","yAlign","round","series","dataX","dataY","scaleX","scaleY","valToPosX","valToPosY","xOff","yOff","xDim","yDim","moveTo","lineTo","arc","d","xs","ys","counts","dlen","fills","fillPalette","fillPaths","yBinQty","xBinQty","yBinIncr","xBinIncr","xOffset","yOffset","cys","cxs","fillPath","p","exemplarColor","points","yVal","randSign","xMaxs","yMins","yMaxs","xOffs","yOffs","xSizeUniform","xMaxPx","yMinPx","yMaxPx","boundedMinMax","values","minValue","maxValue","valuesToFills","palette","range","paletteSize","indexedFills","prepareHeatmapData","frames","annotations","options","getFieldLinks","replaceVariables","exemplars","config","optionsCopy","getDenseHeatmapData","rowsHeatmap","frame","getSparseHeatmapData","numberFields","a","b","updateFieldDisplay","valueField","xName","yName","calcX","calcY","colorSchemes","DEFAULT_SCHEME","scheme","quantizeScheme","steps","fill","tinycolor","scale","fnName","interpolate","rgbStr","rgb","HeatmapPanel","id","timeRange","width","height","fieldConfig","onChangeTimeRange","canAddAnnotations","newAnnotationRange","setNewAnnotationRange","scopedVarsFromRawData","timeRangeRef","getFieldLinksSupplier","info","ex","facets","exemplarsXFacet","exemplarsYFacet","setHover","shouldDisplayCloseButton","setShouldDisplayCloseButton","onCloseToolTip","evt","showNewVizTooltips","scaleConfig","renderLegend","countFieldIdx","VizLayout","PanelDataErrorView","enableAnnotationCreation","vizWidth","vizHeight","ZoomPlugin","TooltipPlugin2","dismiss","timeRange2","viaSync","AnnotationsPlugin2","Portal","VizTooltipContainer","ExemplarModalHeader","heatmapMigrationHandler","panel","heatmapChangedHandler","showTooltip","prevPluginId","prevOptions","prevFieldConfig","angularToReactHeatmap","bucketFrame","angular","calculate","calculation","oldYAxis","asNumber","getHeatmapCellLayout","current","defaultValue","num","HeatmapSuggestionsSupplier","dataSummary","PanelPlugin","context","category"],"sourceRoot":""}