@grafana/ui
Version:
Grafana Components Library
1 lines • 23.5 kB
Source Map (JSON)
{"version":3,"file":"utils.mjs","sources":["../../../../src/components/uPlot/utils.ts"],"sourcesContent":["import uPlot, { AlignedData, Options, PaddingSide } from 'uplot';\n\nimport {\n DataFrame,\n DisplayProcessor,\n DisplayValue,\n Field,\n fieldReducers,\n getDisplayProcessor,\n GrafanaTheme2,\n reduceField,\n ReducerID,\n} from '@grafana/data';\nimport { BarAlignment, GraphDrawStyle, GraphTransform, LineInterpolation, StackingMode } from '@grafana/schema';\n\nimport { attachDebugger } from '../../utils/debug';\nimport { createLogger } from '../../utils/logger';\n\nimport { buildScaleKey } from './internal';\n\nconst paddingSide: PaddingSide = (u, side, sidesWithAxes) => {\n let hasCrossAxis = side % 2 ? sidesWithAxes[0] || sidesWithAxes[2] : sidesWithAxes[1] || sidesWithAxes[3];\n\n return sidesWithAxes[side] || !hasCrossAxis ? 0 : 8;\n};\n\nexport const DEFAULT_PLOT_CONFIG: Partial<Options> = {\n ms: 1,\n focus: {\n alpha: 1,\n },\n cursor: {\n focus: {\n prox: 30,\n },\n },\n legend: {\n show: false,\n },\n padding: [paddingSide, paddingSide, paddingSide, paddingSide],\n series: [],\n hooks: {},\n};\n\n/** @internal */\ninterface StackMeta {\n totals: AlignedData;\n}\n\n/** @internal */\nexport interface StackingGroup {\n series: number[];\n dir: StackDirection;\n}\n\n/** @internal */\nconst enum StackDirection {\n Pos = 1,\n Neg = -1,\n}\n\n// generates bands between adjacent group series\n/** @internal */\nexport function getStackingBands(group: StackingGroup) {\n let bands: uPlot.Band[] = [];\n let { series, dir } = group;\n let lastIdx = series.length - 1;\n\n let rSeries = series.slice().reverse();\n\n rSeries.forEach((si, i) => {\n if (i !== lastIdx) {\n let nextIdx = rSeries[i + 1];\n bands.push({\n series: [si, nextIdx],\n // fill direction is inverted from stack direction\n dir: (-1 * dir) as 1 | -1,\n });\n }\n });\n\n return bands;\n}\n\n// expects an AlignedFrame\n/** @internal */\nexport function getStackingGroups(frame: DataFrame) {\n let groups: Map<string, StackingGroup> = new Map();\n\n frame.fields.forEach(({ config, values, type }, i) => {\n // skip x or time field\n if (i === 0) {\n return;\n }\n\n let { custom } = config;\n\n if (custom == null) {\n return;\n }\n\n // TODO: currently all AlignedFrame fields end up in uplot series & data, even custom.hideFrom?.viz\n // ideally hideFrom.viz fields would be excluded so we can remove this\n if (custom.hideFrom?.viz) {\n return;\n }\n\n let { stacking } = custom;\n\n if (stacking == null) {\n return;\n }\n\n let { mode: stackingMode, group: stackingGroup } = stacking;\n\n // not stacking\n if (stackingMode === StackingMode.None) {\n return;\n }\n\n // will this be stacked up or down after any transforms applied\n let transform = custom.transform;\n let stackDir = getStackDirection(transform, values);\n\n let drawStyle: GraphDrawStyle = custom.drawStyle;\n let drawStyle2: BarAlignment | LineInterpolation | null =\n drawStyle === GraphDrawStyle.Bars\n ? custom.barAlignment\n : drawStyle === GraphDrawStyle.Line\n ? custom.lineInterpolation\n : null;\n\n let stackKey = `${stackDir}|${stackingMode}|${stackingGroup}|${buildScaleKey(\n config,\n type\n )}|${drawStyle}|${drawStyle2}`;\n\n let group = groups.get(stackKey);\n\n if (group == null) {\n group = {\n series: [],\n dir: stackDir,\n };\n\n groups.set(stackKey, group);\n }\n\n group.series.push(i);\n });\n\n return [...groups.values()];\n}\n\n/** @internal */\nexport function preparePlotData2(\n frame: DataFrame,\n stackingGroups: StackingGroup[],\n onStackMeta?: (meta: StackMeta) => void\n): AlignedData {\n let data = Array(frame.fields.length);\n\n let stacksQty = stackingGroups.length;\n\n let dataLen = frame.length;\n let zeroArr = stacksQty > 0 ? Array(dataLen).fill(0) : [];\n let falseArr = stacksQty > 0 ? Array(dataLen).fill(false) : [];\n let accums = Array.from({ length: stacksQty }, () => zeroArr.slice());\n\n let anyValsAtX = Array.from({ length: stacksQty }, () => falseArr.slice());\n\n // figure out at which time indices each stacking group has any values\n // (needed to avoid absorbing initial accum 0s at unrelated joined timestamps)\n stackingGroups.forEach((group, groupIdx) => {\n let groupValsAtX = anyValsAtX[groupIdx];\n\n group.series.forEach((seriesIdx) => {\n let field = frame.fields[seriesIdx];\n\n if (field.config.custom?.hideFrom?.viz) {\n return;\n }\n\n let vals = field.values;\n\n for (let i = 0; i < dataLen; i++) {\n if (vals[i] != null) {\n groupValsAtX[i] = true;\n }\n }\n });\n });\n\n frame.fields.forEach((field, i) => {\n let vals = field.values;\n\n if (i === 0) {\n data[i] = vals;\n return;\n }\n\n let { custom } = field.config;\n\n if (!custom || custom.hideFrom?.viz) {\n data[i] = vals;\n return;\n }\n\n // apply transforms\n if (custom.transform === GraphTransform.Constant) {\n let firstValIdx = vals.findIndex((v) => v != null);\n let firstVal = vals[firstValIdx];\n vals = Array(vals.length).fill(undefined);\n vals[firstValIdx] = firstVal;\n } else {\n vals = vals.slice();\n\n if (custom.transform === GraphTransform.NegativeY) {\n for (let i = 0; i < vals.length; i++) {\n if (vals[i] != null) {\n vals[i] *= -1;\n }\n }\n }\n }\n\n let stackingMode = custom.stacking?.mode;\n\n if (!stackingMode || stackingMode === StackingMode.None) {\n data[i] = vals;\n } else {\n let stackIdx = stackingGroups.findIndex((group) => group.series.indexOf(i) > -1);\n\n let accum = accums[stackIdx];\n let groupValsAtX = anyValsAtX[stackIdx];\n let stacked = (data[i] = Array(dataLen));\n\n for (let i = 0; i < dataLen; i++) {\n let v = vals[i];\n\n if (v != null) {\n stacked[i] = accum[i] += v;\n } else {\n stacked[i] = groupValsAtX[i] ? accum[i] : v;\n }\n }\n }\n });\n\n if (onStackMeta) {\n let accumsBySeriesIdx = data.map((vals, i) => {\n let stackIdx = stackingGroups.findIndex((group) => group.series.indexOf(i) > -1);\n return stackIdx !== -1 ? accums[stackIdx] : vals;\n });\n\n onStackMeta({\n totals: accumsBySeriesIdx,\n });\n }\n\n // re-compute by percent\n frame.fields.forEach((field, i) => {\n if (i === 0 || field.config.custom?.hideFrom?.viz) {\n return;\n }\n\n let stackingMode = field.config.custom?.stacking?.mode;\n\n if (stackingMode === StackingMode.Percent) {\n let stackIdx = stackingGroups.findIndex((group) => group.series.indexOf(i) > -1);\n let accum = accums[stackIdx];\n let group = stackingGroups[stackIdx];\n\n let stacked = data[i];\n\n for (let i = 0; i < dataLen; i++) {\n let v = stacked[i];\n\n if (v != null) {\n // v / accum will always be pos, so properly (re)sign by group stacking dir\n stacked[i] = accum[i] === 0 ? 0 : group.dir * (v / accum[i]);\n }\n }\n }\n });\n\n return data;\n}\n\n/**\n * Finds y axis midpoint for point at given idx (css pixels relative to uPlot canvas)\n * @internal\n **/\n\nexport function findMidPointYPosition(u: uPlot, idx: number) {\n let y;\n let sMaxIdx = 1;\n let sMinIdx = 1;\n // assume min/max being values of 1st series\n let max = u.data[1][idx];\n let min = u.data[1][idx];\n\n // find min max values AND ids of the corresponding series to get the scales\n for (let i = 1; i < u.data.length; i++) {\n const sData = u.data[i];\n const sVal = sData[idx];\n if (sVal != null) {\n if (max == null) {\n max = sVal;\n } else {\n if (sVal > max) {\n max = u.data[i][idx];\n sMaxIdx = i;\n }\n }\n if (min == null) {\n min = sVal;\n } else {\n if (sVal < min) {\n min = u.data[i][idx];\n sMinIdx = i;\n }\n }\n }\n }\n\n if (min == null && max == null) {\n // no tooltip to show\n y = undefined;\n } else if (min != null && max != null) {\n // find median position\n y = (u.valToPos(min, u.series[sMinIdx].scale!) + u.valToPos(max, u.series[sMaxIdx].scale!)) / 2;\n } else {\n // snap tooltip to min OR max point, one of those is not null :)\n y = u.valToPos((min || max)!, u.series[(sMaxIdx || sMinIdx)!].scale!);\n }\n\n // if y is out of canvas bounds, snap it to the bottom\n if (y !== undefined && y < 0) {\n y = u.bbox.height / devicePixelRatio;\n }\n\n return y;\n}\n\nfunction getStackDirection(transform: GraphTransform, data: unknown[]) {\n const hasNegSamp = hasNegSample(data);\n\n if (transform === GraphTransform.NegativeY) {\n return hasNegSamp ? StackDirection.Pos : StackDirection.Neg;\n }\n return hasNegSamp ? StackDirection.Neg : StackDirection.Pos;\n}\n\n// similar to isLikelyAscendingVector()\nfunction hasNegSample(data: unknown[], samples = 100) {\n const len = data.length;\n\n if (len === 0) {\n return false;\n }\n\n // skip leading & trailing nullish\n let firstIdx = 0;\n let lastIdx = len - 1;\n\n while (firstIdx <= lastIdx && data[firstIdx] == null) {\n firstIdx++;\n }\n\n while (lastIdx >= firstIdx && data[lastIdx] == null) {\n lastIdx--;\n }\n\n let negCount = 0;\n let posCount = 0;\n\n if (lastIdx >= firstIdx) {\n const stride = Math.max(1, Math.floor((lastIdx - firstIdx + 1) / samples));\n\n for (let i = firstIdx; i <= lastIdx; i += stride) {\n const v = data[i];\n\n if (v != null && typeof v === 'number') {\n if (v < 0 || Object.is(v, -0)) {\n negCount++;\n } else if (v > 0) {\n posCount++;\n }\n }\n }\n\n if (negCount > posCount) {\n return true;\n }\n }\n\n return false;\n}\n\nexport const getDisplayValuesForCalcs = (calcs: string[], field: Field, theme: GrafanaTheme2) => {\n if (!calcs?.length) {\n return [];\n }\n\n const defaultFormatter = (v: any) => (v == null ? '-' : v.toFixed(1));\n const fmt = field.display ?? defaultFormatter;\n let countFormatter: DisplayProcessor | null = null;\n\n const fieldCalcs = reduceField({\n field: field,\n reducers: calcs,\n });\n\n return calcs.map<DisplayValue>((reducerId) => {\n const fieldReducer = fieldReducers.get(reducerId);\n let formatter = fmt;\n\n if (fieldReducer.id === ReducerID.diffperc) {\n formatter = getDisplayProcessor({\n field: {\n ...field,\n config: {\n ...field.config,\n unit: 'percent',\n },\n },\n theme,\n });\n }\n\n if (\n fieldReducer.id === ReducerID.count ||\n fieldReducer.id === ReducerID.changeCount ||\n fieldReducer.id === ReducerID.distinctCount\n ) {\n if (!countFormatter) {\n countFormatter = getDisplayProcessor({\n field: {\n ...field,\n config: {\n ...field.config,\n unit: 'none',\n },\n },\n theme,\n });\n }\n formatter = countFormatter;\n }\n\n return {\n ...formatter(fieldCalcs[reducerId]),\n title: fieldReducer.name,\n description: fieldReducer.description,\n };\n });\n};\n\n// Dev helpers\n\n/** @internal */\nexport const pluginLogger = createLogger('uPlot');\nexport const pluginLog = pluginLogger.logger;\n// pluginLogger.enable();\nattachDebugger('graphng', undefined, pluginLogger);\n"],"names":["StackDirection","i","group"],"mappings":"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"}