{"version":3,"file":"UPlotSeriesBuilder.mjs","sources":["../../../../../src/components/uPlot/config/UPlotSeriesBuilder.ts"],"sourcesContent":["import uPlot, { Series } from 'uplot';\n\nimport {\n  colorManipulator,\n  DataFrameFieldIndex,\n  FALLBACK_COLOR,\n  FieldColorMode,\n  FieldColorModeId,\n  GrafanaTheme2,\n  ThresholdsConfig,\n} from '@grafana/data';\nimport {\n  BarAlignment,\n  BarConfig,\n  GraphDrawStyle,\n  FillConfig,\n  GraphGradientMode,\n  LineConfig,\n  LineInterpolation,\n  PointsConfig,\n  VisibilityMode,\n} from '@grafana/schema';\n\nimport { PlotConfigBuilder } from '../types';\n\nimport { getHueGradientFn, getOpacityGradientFn, getScaleGradientFn } from './gradientFills';\n\nexport interface SeriesProps extends LineConfig, BarConfig, FillConfig, PointsConfig {\n  scaleKey: string;\n  pxAlign?: boolean;\n  gradientMode?: GraphGradientMode;\n  dynamicSeriesColor?: (seriesIdx: number) => string | undefined;\n\n  facets?: uPlot.Series.Facet[];\n\n  /** Used when gradientMode is set to Scheme */\n  thresholds?: ThresholdsConfig;\n  colorMode?: FieldColorMode;\n  hardMin?: number | null;\n  hardMax?: number | null;\n  softMin?: number | null;\n  softMax?: number | null;\n\n  drawStyle?: GraphDrawStyle;\n  pathBuilder?: Series.PathBuilder | null;\n  pointsFilter?: Series.Points.Filter | null;\n  pointsBuilder?: Series.Points.Show | null;\n  show?: boolean;\n  dataFrameFieldIndex?: DataFrameFieldIndex;\n  theme: GrafanaTheme2;\n  value?: uPlot.Series.Value;\n}\n\nexport class UPlotSeriesBuilder extends PlotConfigBuilder<SeriesProps, Series> {\n  getConfig() {\n    const {\n      facets,\n      drawStyle,\n      pathBuilder,\n      pointsBuilder,\n      pointsFilter,\n      lineInterpolation,\n      lineWidth,\n      lineStyle,\n      barAlignment,\n      barWidthFactor,\n      barMaxWidth,\n      showPoints,\n      pointSize,\n      scaleKey,\n      pxAlign,\n      spanNulls,\n      show = true,\n    } = this.props;\n\n    let lineConfig: Partial<Series> = {};\n\n    let lineColor = this.getLineColor();\n\n    // GraphDrawStyle.Points mode also needs this for fill/stroke sharing & re-use in series.points. see getColor() below.\n    lineConfig.stroke = lineColor;\n\n    lineConfig.width = lineWidth;\n    if (lineStyle && lineStyle.fill !== 'solid') {\n      if (lineStyle.fill === 'dot') {\n        lineConfig.cap = 'round';\n      }\n      lineConfig.dash = lineStyle.dash ?? [10, 10];\n    }\n\n    if (pathBuilder != null) {\n      lineConfig.paths = pathBuilder;\n    } else if (drawStyle === GraphDrawStyle.Points) {\n      lineConfig.paths = () => null;\n    } else if (drawStyle != null) {\n      lineConfig.paths = (self: uPlot, seriesIdx: number, idx0: number, idx1: number) => {\n        let pathsBuilder = mapDrawStyleToPathBuilder(\n          drawStyle,\n          lineInterpolation,\n          barAlignment,\n          barWidthFactor,\n          barMaxWidth\n        );\n        return pathsBuilder(self, seriesIdx, idx0, idx1);\n      };\n    }\n\n    const useColor: uPlot.Series.Stroke =\n      // @ts-ignore\n      typeof lineColor === 'string' ? lineColor : (u, seriesIdx) => u.series[seriesIdx]._stroke;\n\n    const pointsConfig: Partial<Series> = {\n      points: {\n        stroke: useColor,\n        fill: useColor,\n        size: !pointSize || pointSize < lineWidth! ? undefined : pointSize,\n        filter: pointsFilter,\n      },\n    };\n\n    if (pointsBuilder != null) {\n      pointsConfig.points!.show = pointsBuilder;\n    } else {\n      // we cannot set points.show property above (even to undefined) as that will clear uPlot's default auto behavior\n      if (drawStyle === GraphDrawStyle.Points) {\n        pointsConfig.points!.show = true;\n      } else {\n        if (showPoints === VisibilityMode.Auto) {\n          if (drawStyle === GraphDrawStyle.Bars) {\n            pointsConfig.points!.show = false;\n          }\n        } else if (showPoints === VisibilityMode.Never) {\n          pointsConfig.points!.show = false;\n        } else if (showPoints === VisibilityMode.Always) {\n          pointsConfig.points!.show = true;\n        }\n      }\n    }\n\n    return {\n      scale: scaleKey,\n      facets,\n      spanGaps: typeof spanNulls === 'number' ? false : spanNulls,\n      value: () => '',\n      pxAlign,\n      show,\n      fill: this.getFill(),\n      ...lineConfig,\n      ...pointsConfig,\n    };\n  }\n\n  private getLineColor(): Series.Stroke {\n    const {\n      lineColor,\n      gradientMode,\n      colorMode,\n      thresholds,\n      theme,\n      hardMin,\n      hardMax,\n      softMin,\n      softMax,\n      dynamicSeriesColor,\n    } = this.props;\n\n    if (gradientMode === GraphGradientMode.None && dynamicSeriesColor) {\n      return (plot: uPlot, seriesIdx: number) => dynamicSeriesColor(seriesIdx) ?? lineColor ?? FALLBACK_COLOR;\n    }\n\n    if (gradientMode === GraphGradientMode.Scheme && colorMode?.id !== FieldColorModeId.Fixed) {\n      return getScaleGradientFn(1, theme, colorMode, thresholds, hardMin, hardMax, softMin, softMax);\n    }\n\n    if (gradientMode === GraphGradientMode.Hue) {\n      return getHueGradientFn(lineColor ?? FALLBACK_COLOR, 1, theme);\n    }\n\n    return lineColor ?? FALLBACK_COLOR;\n  }\n\n  private getFill(): Series.Fill | undefined {\n    const {\n      lineColor,\n      fillColor,\n      gradientMode,\n      fillOpacity,\n      colorMode,\n      thresholds,\n      theme,\n      hardMin,\n      hardMax,\n      softMin,\n      softMax,\n      dynamicSeriesColor,\n    } = this.props;\n\n    if (fillColor) {\n      return fillColor;\n    }\n\n    const mode = gradientMode ?? GraphGradientMode.None;\n    const opacityPercent = (fillOpacity ?? 0) / 100;\n\n    if (mode === GraphGradientMode.None && dynamicSeriesColor && opacityPercent > 0) {\n      return (u: uPlot, seriesIdx: number) => {\n        // @ts-ignore\n        let lineColor = u.series[seriesIdx]._stroke; // cache\n        return colorManipulator.alpha(lineColor ?? '', opacityPercent);\n      };\n    }\n\n    switch (mode) {\n      case GraphGradientMode.Opacity:\n        return getOpacityGradientFn((fillColor ?? lineColor)!, opacityPercent);\n      case GraphGradientMode.Hue:\n        return getHueGradientFn((fillColor ?? lineColor)!, opacityPercent, theme);\n      case GraphGradientMode.Scheme:\n        if (colorMode?.id !== FieldColorModeId.Fixed) {\n          return getScaleGradientFn(opacityPercent, theme, colorMode, thresholds, hardMin, hardMax, softMin, softMax);\n        }\n      // intentional fall-through to handle Scheme with Fixed color\n      default:\n        if (opacityPercent > 0) {\n          return colorManipulator.alpha(lineColor ?? '', opacityPercent);\n        }\n    }\n\n    return undefined;\n  }\n}\n\ninterface PathBuilders {\n  linear: Series.PathBuilder;\n  smooth: Series.PathBuilder;\n  stepBefore: Series.PathBuilder;\n  stepAfter: Series.PathBuilder;\n  [key: string]: Series.PathBuilder;\n}\n\nlet builders: PathBuilders | undefined = undefined;\n\nfunction mapDrawStyleToPathBuilder(\n  style: GraphDrawStyle,\n  lineInterpolation?: LineInterpolation,\n  barAlignment = BarAlignment.Center,\n  barWidthFactor = 0.6,\n  barMaxWidth = 200\n): Series.PathBuilder {\n  const pathBuilders = uPlot.paths;\n\n  if (!builders) {\n    // This should be global static, but Jest initalization was failing so we lazy load to avoid the issue\n    builders = {\n      linear: pathBuilders.linear!(),\n      smooth: pathBuilders.spline!(),\n      stepBefore: pathBuilders.stepped!({ align: -1 }),\n      stepAfter: pathBuilders.stepped!({ align: 1 }),\n    };\n  }\n\n  if (style === GraphDrawStyle.Bars) {\n    // each bars pathBuilder is lazy-initialized and globally cached by a key composed of its options\n    let barsCfgKey = `bars|${barAlignment}|${barWidthFactor}|${barMaxWidth}`;\n\n    if (!builders[barsCfgKey]) {\n      builders[barsCfgKey] = pathBuilders.bars!({\n        size: [barWidthFactor, barMaxWidth],\n        align: barAlignment,\n      });\n    }\n\n    return builders[barsCfgKey];\n  } else if (style === GraphDrawStyle.Line) {\n    if (lineInterpolation === LineInterpolation.StepBefore) {\n      return builders.stepBefore;\n    }\n    if (lineInterpolation === LineInterpolation.StepAfter) {\n      return builders.stepAfter;\n    }\n    if (lineInterpolation === LineInterpolation.Smooth) {\n      return builders.smooth;\n    }\n  }\n\n  return builders.linear; // the default\n}\n"],"names":["lineColor"],"mappings":"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"}