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