UNPKG

@grafana/ui

Version:
1 lines 8.62 kB
{"version":3,"file":"UPlotThresholds.mjs","sources":["../../../../../src/components/uPlot/config/UPlotThresholds.ts"],"sourcesContent":["import tinycolor from 'tinycolor2';\nimport uPlot from 'uplot';\n\nimport { GrafanaTheme2, Threshold, ThresholdsConfig, ThresholdsMode } from '@grafana/data';\nimport { GraphThresholdsStyleConfig, GraphThresholdsStyleMode, ScaleOrientation } from '@grafana/schema';\n\nimport { getGradientRange, scaleGradient } from './gradientFills';\n\nexport interface UPlotThresholdOptions {\n scaleKey: string;\n thresholds: ThresholdsConfig;\n config: GraphThresholdsStyleConfig;\n theme: GrafanaTheme2;\n hardMin?: number | null;\n hardMax?: number | null;\n softMin?: number | null;\n softMax?: number | null;\n}\n\nexport function getThresholdsDrawHook(options: UPlotThresholdOptions) {\n const dashSegments =\n options.config.mode === GraphThresholdsStyleMode.Dashed ||\n options.config.mode === GraphThresholdsStyleMode.DashedAndArea\n ? [10, 10]\n : [];\n\n function addLines(u: uPlot, yScaleKey: string, steps: Threshold[], theme: GrafanaTheme2) {\n let ctx = u.ctx;\n\n // Thresholds below a transparent threshold is treated like \"less than\", and line drawn previous threshold\n let transparentIndex = 0;\n\n for (let idx = 0; idx < steps.length; idx++) {\n const step = steps[idx];\n if (step.color === 'transparent') {\n transparentIndex = idx;\n break;\n }\n }\n\n ctx.lineWidth = 2;\n ctx.setLineDash(dashSegments);\n\n // Ignore the base -Infinity threshold by always starting on index 1\n for (let idx = 1; idx < steps.length; idx++) {\n const step = steps[idx];\n let color: tinycolor.Instance;\n\n // if we are below a transparent index treat this a less then threshold, use previous thresholds color\n if (transparentIndex >= idx && idx > 0) {\n color = tinycolor(theme.visualization.getColorByName(steps[idx - 1].color));\n } else {\n color = tinycolor(theme.visualization.getColorByName(step.color));\n }\n\n // Unless alpha specififed set to default value\n if (color.getAlpha() === 1) {\n color.setAlpha(0.7);\n }\n\n const isHorizontal = u.scales.x!.ori === ScaleOrientation.Horizontal;\n const scaleVal = u.valToPos(step.value, yScaleKey, true);\n\n let x0 = Math.round(isHorizontal ? u.bbox.left : scaleVal);\n let y0 = Math.round(isHorizontal ? scaleVal : u.bbox.top);\n let x1 = Math.round(isHorizontal ? u.bbox.left + u.bbox.width : scaleVal);\n let y1 = Math.round(isHorizontal ? scaleVal : u.bbox.top + u.bbox.height);\n\n ctx.beginPath();\n ctx.moveTo(x0, y0);\n ctx.lineTo(x1, y1);\n\n ctx.strokeStyle = color.toString();\n ctx.stroke();\n }\n }\n\n function addAreas(u: uPlot, yScaleKey: string, steps: Threshold[], theme: GrafanaTheme2) {\n let ctx = u.ctx;\n\n let grd = scaleGradient(\n u,\n yScaleKey,\n steps.map((step) => {\n let color = tinycolor(theme.visualization.getColorByName(step.color));\n\n if (color.getAlpha() === 1) {\n color.setAlpha(0.15);\n }\n\n return [step.value, color.toString()];\n }),\n true\n );\n\n ctx.fillStyle = grd;\n ctx.fillRect(u.bbox.left, u.bbox.top, u.bbox.width, u.bbox.height);\n }\n\n const { scaleKey, thresholds, theme, config, hardMin, hardMax, softMin, softMax } = options;\n\n return (u: uPlot) => {\n const ctx = u.ctx;\n const { min: xMin, max: xMax } = u.scales.x;\n const { min: yMin, max: yMax } = u.scales[scaleKey];\n\n if (xMin == null || xMax == null || yMin == null || yMax == null) {\n return;\n }\n\n let { steps, mode } = thresholds;\n\n if (mode === ThresholdsMode.Percentage) {\n let [min, max] = getGradientRange(u, scaleKey, hardMin, hardMax, softMin, softMax);\n let range = max - min;\n\n steps = steps.map((step) => ({\n ...step,\n value: min + range * (step.value / 100),\n }));\n }\n\n ctx.save();\n\n switch (config.mode) {\n case GraphThresholdsStyleMode.Line:\n case GraphThresholdsStyleMode.Dashed:\n addLines(u, scaleKey, steps, theme);\n break;\n case GraphThresholdsStyleMode.Area:\n addAreas(u, scaleKey, steps, theme);\n break;\n case GraphThresholdsStyleMode.LineAndArea:\n case GraphThresholdsStyleMode.DashedAndArea:\n addAreas(u, scaleKey, steps, theme);\n addLines(u, scaleKey, steps, theme);\n }\n\n ctx.restore();\n };\n}\n"],"names":["theme"],"mappings":"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"}