@grafana/ui
Version:
Grafana Components Library
1 lines • 17 kB
Source Map (JSON)
{"version":3,"file":"UPlotScaleBuilder.cjs","sources":["../../../../../src/components/uPlot/config/UPlotScaleBuilder.ts"],"sourcesContent":["import uPlot, { type Scale, type Range } from 'uplot';\n\nimport { type DecimalCount, incrRoundDn, incrRoundUp, isBooleanUnit } from '@grafana/data';\nimport { type ScaleOrientation, type ScaleDirection, ScaleDistribution, StackingMode } from '@grafana/schema';\n\nimport { PlotConfigBuilder } from '../types';\n\nexport interface ScaleProps {\n scaleKey: string;\n isTime?: boolean;\n auto?: boolean;\n min?: number | null;\n max?: number | null;\n softMin?: number | null;\n softMax?: number | null;\n range?: Scale.Range;\n distribution?: ScaleDistribution;\n orientation: ScaleOrientation;\n direction: ScaleDirection;\n log?: number;\n linearThreshold?: number;\n centeredZero?: boolean;\n decimals?: DecimalCount;\n stackingMode?: StackingMode;\n padMinBy?: number;\n padMaxBy?: number;\n}\n\nconst isValidLogBase = (v: number | undefined): v is Scale.LogBase => v === 2 || v === 10;\n\n// only used if no log is passed in from the consumer of UPlotScaleBuilder and logrithmic distribution is selected.\n// we probably want to avoid this fallback!\nconst FALLBACK_LOG: Scale.LogBase = 10;\n\n// mapping between uPlot and our ScaleDistribution enum values\nconst DISTR_MAP: Record<ScaleDistribution, uPlot.Scale.Distr> = {\n [ScaleDistribution.Linear]: 1,\n [ScaleDistribution.Ordinal]: 2,\n [ScaleDistribution.Log]: 3,\n [ScaleDistribution.Symlog]: 4,\n // custom is 100 in uPlot, but we don't support it so not mapping here\n};\n\nexport class UPlotScaleBuilder extends PlotConfigBuilder<ScaleProps, Scale> {\n merge(props: ScaleProps) {\n this.props.min = optMinMax('min', this.props.min, props.min);\n this.props.max = optMinMax('max', this.props.max, props.max);\n }\n\n getConfig(): uPlot.Scales {\n let {\n isTime,\n auto,\n scaleKey,\n min: hardMin,\n max: hardMax,\n softMin,\n softMax,\n range,\n direction,\n orientation,\n centeredZero,\n decimals,\n stackingMode,\n padMinBy = 0.1,\n padMaxBy = 0.1,\n } = this.props;\n\n if (stackingMode === StackingMode.Percent) {\n if (hardMin == null && softMin == null) {\n softMin = 0;\n }\n\n if (hardMax == null && softMax == null) {\n softMax = 1;\n }\n }\n\n const distr = this.props.distribution;\n const safeLog = isValidLogBase(this.props.log) ? this.props.log : FALLBACK_LOG;\n\n const distribution = !isTime\n ? {\n distr: distr ? DISTR_MAP[distr] : DISTR_MAP[ScaleDistribution.Linear],\n log: distr === ScaleDistribution.Log || distr === ScaleDistribution.Symlog ? safeLog : undefined,\n asinh: distr === ScaleDistribution.Symlog ? (this.props.linearThreshold ?? 1) : undefined,\n }\n : {};\n\n // guard against invalid log scale limits <= 0, or snap to log boundaries\n if (distr === ScaleDistribution.Log) {\n const logFn = safeLog === 2 ? Math.log2 : Math.log10;\n\n if (hardMin != null) {\n if (hardMin <= 0) {\n hardMin = null;\n } else {\n hardMin = safeLog ** Math.floor(logFn(hardMin));\n }\n }\n\n if (hardMax != null) {\n if (hardMax <= 0) {\n hardMax = null;\n } else {\n hardMax = safeLog ** Math.ceil(logFn(hardMax));\n }\n }\n\n if (softMin != null) {\n if (softMin <= 0) {\n softMin = null;\n } else {\n softMin = safeLog ** Math.floor(logFn(softMin));\n }\n }\n\n if (softMax != null) {\n if (softMax <= 0) {\n softMax = null;\n } else {\n softMax = safeLog ** Math.ceil(logFn(softMax));\n }\n }\n }\n\n // uPlot's default ranging config for both min & max is {pad: 0.1, hard: null, soft: 0, mode: 3}\n const softMinMode: Range.SoftMode = softMin == null ? 3 : 1;\n const softMaxMode: Range.SoftMode = softMax == null ? 3 : 1;\n\n const rangeConfig: Range.Config = {\n min: {\n pad: padMinBy,\n hard: hardMin ?? -Infinity,\n soft: softMin || 0,\n mode: softMinMode,\n },\n max: {\n pad: padMaxBy,\n hard: hardMax ?? Infinity,\n soft: softMax || 0,\n mode: softMaxMode,\n },\n };\n\n const hardMinOnly = softMin == null && hardMin != null;\n const hardMaxOnly = softMax == null && hardMax != null;\n const hasFixedRange = hardMinOnly && hardMaxOnly;\n\n const rangeFn: uPlot.Range.Function = (\n u: uPlot,\n dataMin: number | null,\n dataMax: number | null,\n scaleKey: string\n ) => {\n const scale = u.scales[scaleKey];\n\n let minMax: uPlot.Range.MinMax = [dataMin, dataMax];\n\n // happens when all series on a scale are `show: false`, re-returning nulls will auto-disable axis\n if (!hasFixedRange && dataMin == null && dataMax == null) {\n return minMax;\n }\n\n const logBase = scale.log ?? FALLBACK_LOG;\n\n if (\n scale.distr === DISTR_MAP[ScaleDistribution.Linear] ||\n scale.distr === DISTR_MAP[ScaleDistribution.Ordinal] ||\n scale.distr === DISTR_MAP[ScaleDistribution.Symlog]\n ) {\n if (centeredZero) {\n const absMin = Math.abs(dataMin!);\n const absMax = Math.abs(dataMax!);\n let max = Math.max(absMin, absMax);\n\n // flat 0\n if (max === 0) {\n max = 80;\n }\n\n dataMin = -max;\n dataMax = max;\n }\n\n if (scale.distr === 4) {\n minMax = uPlot.rangeAsinh(dataMin!, dataMax!, logBase, true);\n } else {\n // @ts-ignore here we may use hardMin / hardMax to make sure any extra padding is computed from a more accurate delta\n minMax = uPlot.rangeNum(hardMinOnly ? hardMin : dataMin, hardMaxOnly ? hardMax : dataMax, rangeConfig);\n }\n } else if (scale.distr === DISTR_MAP[ScaleDistribution.Log]) {\n minMax = uPlot.rangeLog(hardMin ?? dataMin!, hardMax ?? dataMax!, logBase, true);\n }\n\n if (decimals === 0) {\n if (\n scale.distr === DISTR_MAP[ScaleDistribution.Linear] ||\n scale.distr === DISTR_MAP[ScaleDistribution.Ordinal]\n ) {\n minMax[0] = incrRoundDn(minMax[0]!, 1);\n minMax[1] = incrRoundUp(minMax[1]!, 1);\n }\n // log2 or log10 scale min must be clamped to 1\n else if (scale.distr === DISTR_MAP[ScaleDistribution.Log]) {\n const logFn = scale.log === 2 ? Math.log2 : Math.log10;\n\n if (minMax[0]! <= 1) {\n // clamp min\n minMax[0] = 1;\n } else {\n // snap min to nearest mag below\n const minExp = Math.floor(logFn(minMax[0]!));\n minMax[0] = logBase ** minExp;\n }\n\n // snap max to nearest mag above\n const maxExp = Math.ceil(logFn(minMax[1]!));\n minMax[1] = logBase ** maxExp;\n\n // inflate max by mag if same\n if (minMax[0] === minMax[1]) {\n minMax[1] *= logBase;\n }\n }\n // TODO: this should be better. symlog values can be <= 0, but should also be snapped to log2 or log10 boundaries\n // for now we just do same as linear snapping above, so may have non-neat range and ticks at edges\n else if (scale.distr === 4) {\n minMax[0] = incrRoundDn(minMax[0]!, 1);\n minMax[1] = incrRoundUp(minMax[1]!, 1);\n }\n }\n\n if (scale.distr === 1 || scale.distr === 4) {\n // if all we got were hard limits, treat them as static min/max\n if (hardMinOnly) {\n minMax[0] = hardMin!;\n }\n\n if (hardMaxOnly) {\n minMax[1] = hardMax!;\n }\n }\n\n // for tiny ranges like 0.999999999811111, 1, uPlot's rangeNum may return [1,1]\n if (minMax[0]! === minMax[1]! && minMax[0]! !== 0) {\n // only applies to linear scales\n if (scale.distr === 1) {\n if (minMax[0] < 0) {\n minMax[0] *= 2;\n minMax[1] = 0;\n } else {\n minMax[1] *= 2;\n minMax[0] = 0;\n }\n }\n }\n\n // guard against invalid y ranges\n if (minMax[0]! >= minMax[1]!) {\n minMax[0] = scale.distr === DISTR_MAP[ScaleDistribution.Log] ? 1 : 0;\n minMax[1] = 100;\n }\n\n return minMax;\n };\n\n auto ??= !isTime && !hasFixedRange;\n\n if (isBooleanUnit(scaleKey)) {\n auto = false;\n range = [0, 1];\n }\n\n return {\n [scaleKey]: {\n time: isTime,\n auto,\n range: range ?? rangeFn,\n dir: direction,\n ori: orientation,\n ...distribution,\n },\n };\n }\n}\n\nexport function optMinMax(minmax: 'min' | 'max', a?: number | null, b?: number | null): undefined | number | null {\n const hasA = !(a === undefined || a === null);\n const hasB = !(b === undefined || b === null);\n if (hasA) {\n if (!hasB) {\n return a;\n }\n if (minmax === 'min') {\n return a! < b! ? a : b;\n }\n return a! > b! ? a : b;\n }\n return b;\n}\n"],"names":["ScaleDistribution","PlotConfigBuilder","StackingMode","scaleKey","_a","uPlot","incrRoundDn","incrRoundUp","isBooleanUnit"],"mappings":"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"}