{"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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"}