{"version":3,"file":"UPlotSeriesBuilder.cjs","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  showValues?: boolean;\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":["PlotConfigBuilder","GraphDrawStyle","VisibilityMode","GraphGradientMode","FALLBACK_COLOR","FieldColorModeId","getScaleGradientFn","getHueGradientFn","lineColor","colorManipulator","getOpacityGradientFn","BarAlignment","uPlot","LineInterpolation"],"mappings":";;;;;;;;;;;;;;;AAsDO,MAAM,2BAA2BA,uBAAA,CAAuC;AAAA,EAC7E,SAAA,GAAY;AAvDd,IAAA,IAAA,EAAA;AAwDI,IAAA,MAAM;AAAA,MACJ,MAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA;AAAA,MACA,iBAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,cAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA,MACA,SAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA;AAAA,MACA,SAAA;AAAA,MACA,IAAA,GAAO;AAAA,QACL,IAAA,CAAK,KAAA;AAET,IAAA,IAAI,aAA8B,EAAC;AAEnC,IAAA,IAAI,SAAA,GAAY,KAAK,YAAA,EAAa;AAGlC,IAAA,UAAA,CAAW,MAAA,GAAS,SAAA;AAEpB,IAAA,UAAA,CAAW,KAAA,GAAQ,SAAA;AACnB,IAAA,IAAI,SAAA,IAAa,SAAA,CAAU,IAAA,KAAS,OAAA,EAAS;AAC3C,MAAA,IAAI,SAAA,CAAU,SAAS,KAAA,EAAO;AAC5B,QAAA,UAAA,CAAW,GAAA,GAAM,OAAA;AAAA,MACnB;AACA,MAAA,UAAA,CAAW,QAAO,EAAA,GAAA,SAAA,CAAU,IAAA,KAAV,IAAA,GAAA,EAAA,GAAkB,CAAC,IAAI,EAAE,CAAA;AAAA,IAC7C;AAEA,IAAA,IAAI,eAAe,IAAA,EAAM;AACvB,MAAA,UAAA,CAAW,KAAA,GAAQ,WAAA;AAAA,IACrB,CAAA,MAAA,IAAW,SAAA,KAAcC,qBAAA,CAAe,MAAA,EAAQ;AAC9C,MAAA,UAAA,CAAW,QAAQ,MAAM,IAAA;AAAA,IAC3B,CAAA,MAAA,IAAW,aAAa,IAAA,EAAM;AAC5B,MAAA,UAAA,CAAW,KAAA,GAAQ,CAAC,IAAA,EAAa,SAAA,EAAmB,MAAc,IAAA,KAAiB;AACjF,QAAA,IAAI,YAAA,GAAe,yBAAA;AAAA,UACjB,SAAA;AAAA,UACA,iBAAA;AAAA,UACA,YAAA;AAAA,UACA,cAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,OAAO,YAAA,CAAa,IAAA,EAAM,SAAA,EAAW,IAAA,EAAM,IAAI,CAAA;AAAA,MACjD,CAAA;AAAA,IACF;AAEA,IAAA,MAAM,QAAA;AAAA;AAAA,MAEJ,OAAO,SAAA,KAAc,QAAA,GAAW,SAAA,GAAY,CAAC,GAAG,SAAA,KAAc,CAAA,CAAE,MAAA,CAAO,SAAS,CAAA,CAAE;AAAA,KAAA;AAEpF,IAAA,MAAM,YAAA,GAAgC;AAAA,MACpC,MAAA,EAAQ;AAAA,QACN,MAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,CAAC,SAAA,IAAa,SAAA,GAAY,YAAa,KAAA,CAAA,GAAY,SAAA;AAAA,QACzD,MAAA,EAAQ;AAAA;AACV,KACF;AAEA,IAAA,IAAI,iBAAiB,IAAA,EAAM;AACzB,MAAA,YAAA,CAAa,OAAQ,IAAA,GAAO,aAAA;AAAA,IAC9B,CAAA,MAAO;AAEL,MAAA,IAAI,SAAA,KAAcA,sBAAe,MAAA,EAAQ;AACvC,QAAA,YAAA,CAAa,OAAQ,IAAA,GAAO,IAAA;AAAA,MAC9B,CAAA,MAAO;AACL,QAAA,IAAI,UAAA,KAAeC,sBAAe,IAAA,EAAM;AACtC,UAAA,IAAI,SAAA,KAAcD,sBAAe,IAAA,EAAM;AACrC,YAAA,YAAA,CAAa,OAAQ,IAAA,GAAO,KAAA;AAAA,UAC9B;AAAA,QACF,CAAA,MAAA,IAAW,UAAA,KAAeC,qBAAA,CAAe,KAAA,EAAO;AAC9C,UAAA,YAAA,CAAa,OAAQ,IAAA,GAAO,KAAA;AAAA,QAC9B,CAAA,MAAA,IAAW,UAAA,KAAeA,qBAAA,CAAe,MAAA,EAAQ;AAC/C,UAAA,YAAA,CAAa,OAAQ,IAAA,GAAO,IAAA;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,QAAA;AAAA,MACP,MAAA;AAAA,MACA,QAAA,EAAU,OAAO,SAAA,KAAc,QAAA,GAAW,KAAA,GAAQ,SAAA;AAAA,MAClD,OAAO,MAAM,EAAA;AAAA,MACb,OAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA,EAAM,KAAK,OAAA,EAAQ;AAAA,MACnB,GAAG,UAAA;AAAA,MACH,GAAG;AAAA,KACL;AAAA,EACF;AAAA,EAEQ,YAAA,GAA8B;AACpC,IAAA,MAAM;AAAA,MACJ,SAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,QACE,IAAA,CAAK,KAAA;AAET,IAAA,IAAI,YAAA,KAAiBC,wBAAA,CAAkB,IAAA,IAAQ,kBAAA,EAAoB;AACjE,MAAA,OAAO,CAAC,MAAa,SAAA,KAAmB;AAxK9C,QAAA,IAAA,EAAA,EAAA,EAAA;AAwKiD,QAAA,OAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,kBAAA,CAAmB,SAAS,CAAA,KAA5B,IAAA,GAAA,EAAA,GAAiC,SAAA,KAAjC,IAAA,GAAA,EAAA,GAA8CC,mBAAA;AAAA,MAAA,CAAA;AAAA,IAC3F;AAEA,IAAA,IAAI,iBAAiBD,wBAAA,CAAkB,MAAA,IAAA,CAAU,SAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,SAAA,CAAW,EAAA,MAAOE,sBAAiB,KAAA,EAAO;AACzF,MAAA,OAAOC,gCAAA,CAAmB,GAAG,KAAA,EAAO,SAAA,EAAW,YAAY,OAAA,EAAS,OAAA,EAAS,SAAS,OAAO,CAAA;AAAA,IAC/F;AAEA,IAAA,IAAI,YAAA,KAAiBH,yBAAkB,GAAA,EAAK;AAC1C,MAAA,OAAOI,8BAAA,CAAiB,SAAA,IAAA,IAAA,GAAA,SAAA,GAAaH,mBAAA,EAAgB,CAAA,EAAG,KAAK,CAAA;AAAA,IAC/D;AAEA,IAAA,OAAO,SAAA,IAAA,IAAA,GAAA,SAAA,GAAaA,mBAAA;AAAA,EACtB;AAAA,EAEQ,OAAA,GAAmC;AACzC,IAAA,MAAM;AAAA,MACJ,SAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,QACE,IAAA,CAAK,KAAA;AAET,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAO,SAAA;AAAA,IACT;AAEA,IAAA,MAAM,IAAA,GAAO,sCAAgBD,wBAAA,CAAkB,IAAA;AAC/C,IAAA,MAAM,cAAA,GAAA,CAAkB,oCAAe,CAAA,IAAK,GAAA;AAE5C,IAAA,IAAI,IAAA,KAASA,wBAAA,CAAkB,IAAA,IAAQ,kBAAA,IAAsB,iBAAiB,CAAA,EAAG;AAC/E,MAAA,OAAO,CAAC,GAAU,SAAA,KAAsB;AAEtC,QAAA,IAAIK,UAAAA,GAAY,CAAA,CAAE,MAAA,CAAO,SAAS,CAAA,CAAE,OAAA;AACpC,QAAA,OAAOC,sBAAiB,KAAA,CAAMD,UAAAA,IAAA,IAAA,GAAAA,UAAAA,GAAa,IAAI,cAAc,CAAA;AAAA,MAC/D,CAAA;AAAA,IACF;AAEA,IAAA,QAAQ,IAAA;AAAM,MACZ,KAAKL,wBAAA,CAAkB,OAAA;AACrB,QAAA,OAAOO,kCAAA,CAAsB,SAAA,IAAA,IAAA,GAAA,SAAA,GAAa,SAAA,EAAa,cAAc,CAAA;AAAA,MACvE,KAAKP,wBAAA,CAAkB,GAAA;AACrB,QAAA,OAAOI,8BAAA,CAAkB,SAAA,IAAA,IAAA,GAAA,SAAA,GAAa,SAAA,EAAa,cAAA,EAAgB,KAAK,CAAA;AAAA,MAC1E,KAAKJ,wBAAA,CAAkB,MAAA;AACrB,QAAA,IAAA,CAAI,SAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,SAAA,CAAW,EAAA,MAAOE,qBAAA,CAAiB,KAAA,EAAO;AAC5C,UAAA,OAAOC,gCAAA,CAAmB,gBAAgB,KAAA,EAAO,SAAA,EAAW,YAAY,OAAA,EAAS,OAAA,EAAS,SAAS,OAAO,CAAA;AAAA,QAC5G;AAAA;AAAA,MAEF;AACE,QAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,UAAA,OAAOG,qBAAA,CAAiB,KAAA,CAAM,SAAA,IAAA,IAAA,GAAA,SAAA,GAAa,EAAA,EAAI,cAAc,CAAA;AAAA,QAC/D;AAAA;AAGJ,IAAA,OAAO,KAAA,CAAA;AAAA,EACT;AACF;AAUA,IAAI,QAAA,GAAqC,KAAA,CAAA;AAEzC,SAAS,yBAAA,CACP,OACA,iBAAA,EACA,YAAA,GAAeE,oBAAa,MAAA,EAC5B,cAAA,GAAiB,GAAA,EACjB,WAAA,GAAc,GAAA,EACM;AACpB,EAAA,MAAM,eAAeC,sBAAA,CAAM,KAAA;AAE3B,EAAA,IAAI,CAAC,QAAA,EAAU;AAEb,IAAA,QAAA,GAAW;AAAA,MACT,MAAA,EAAQ,aAAa,MAAA,EAAQ;AAAA,MAC7B,MAAA,EAAQ,aAAa,MAAA,EAAQ;AAAA,MAC7B,YAAY,YAAA,CAAa,OAAA,CAAS,EAAE,KAAA,EAAO,IAAI,CAAA;AAAA,MAC/C,WAAW,YAAA,CAAa,OAAA,CAAS,EAAE,KAAA,EAAO,GAAG;AAAA,KAC/C;AAAA,EACF;AAEA,EAAA,IAAI,KAAA,KAAUX,sBAAe,IAAA,EAAM;AAEjC,IAAA,IAAI,aAAa,CAAA,KAAA,EAAQ,YAAY,CAAA,CAAA,EAAI,cAAc,IAAI,WAAW,CAAA,CAAA;AAEtE,IAAA,IAAI,CAAC,QAAA,CAAS,UAAU,CAAA,EAAG;AACzB,MAAA,QAAA,CAAS,UAAU,CAAA,GAAI,YAAA,CAAa,IAAA,CAAM;AAAA,QACxC,IAAA,EAAM,CAAC,cAAA,EAAgB,WAAW,CAAA;AAAA,QAClC,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,SAAS,UAAU,CAAA;AAAA,EAC5B,CAAA,MAAA,IAAW,KAAA,KAAUA,qBAAA,CAAe,IAAA,EAAM;AACxC,IAAA,IAAI,iBAAA,KAAsBY,yBAAkB,UAAA,EAAY;AACtD,MAAA,OAAO,QAAA,CAAS,UAAA;AAAA,IAClB;AACA,IAAA,IAAI,iBAAA,KAAsBA,yBAAkB,SAAA,EAAW;AACrD,MAAA,OAAO,QAAA,CAAS,SAAA;AAAA,IAClB;AACA,IAAA,IAAI,iBAAA,KAAsBA,yBAAkB,MAAA,EAAQ;AAClD,MAAA,OAAO,QAAA,CAAS,MAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,OAAO,QAAA,CAAS,MAAA;AAClB;;;;"}