@grafana/ui
Version:
Grafana Components Library
1 lines • 14.2 kB
Source Map (JSON)
{"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":";;;;;;AAqDO,MAAM,2BAA2B,iBAAuC,CAAA;AAAA,EAC7E,SAAY,GAAA;AAtDd,IAAA,IAAA,EAAA;AAuDI,IAAM,MAAA;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,IAAO,GAAA;AAAA,QACL,IAAK,CAAA,KAAA;AAET,IAAA,IAAI,aAA8B,EAAC;AAEnC,IAAI,IAAA,SAAA,GAAY,KAAK,YAAa,EAAA;AAGlC,IAAA,UAAA,CAAW,MAAS,GAAA,SAAA;AAEpB,IAAA,UAAA,CAAW,KAAQ,GAAA,SAAA;AACnB,IAAI,IAAA,SAAA,IAAa,SAAU,CAAA,IAAA,KAAS,OAAS,EAAA;AAC3C,MAAI,IAAA,SAAA,CAAU,SAAS,KAAO,EAAA;AAC5B,QAAA,UAAA,CAAW,GAAM,GAAA,OAAA;AAAA;AAEnB,MAAA,UAAA,CAAW,QAAO,EAAU,GAAA,SAAA,CAAA,IAAA,KAAV,IAAkB,GAAA,EAAA,GAAA,CAAC,IAAI,EAAE,CAAA;AAAA;AAG7C,IAAA,IAAI,eAAe,IAAM,EAAA;AACvB,MAAA,UAAA,CAAW,KAAQ,GAAA,WAAA;AAAA,KACrB,MAAA,IAAW,SAAc,KAAA,cAAA,CAAe,MAAQ,EAAA;AAC9C,MAAA,UAAA,CAAW,QAAQ,MAAM,IAAA;AAAA,KAC3B,MAAA,IAAW,aAAa,IAAM,EAAA;AAC5B,MAAA,UAAA,CAAW,KAAQ,GAAA,CAAC,IAAa,EAAA,SAAA,EAAmB,MAAc,IAAiB,KAAA;AACjF,QAAA,IAAI,YAAe,GAAA,yBAAA;AAAA,UACjB,SAAA;AAAA,UACA,iBAAA;AAAA,UACA,YAAA;AAAA,UACA,cAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,OAAO,YAAa,CAAA,IAAA,EAAM,SAAW,EAAA,IAAA,EAAM,IAAI,CAAA;AAAA,OACjD;AAAA;AAGF,IAAM,MAAA,QAAA;AAAA;AAAA,MAEJ,OAAO,SAAc,KAAA,QAAA,GAAW,SAAY,GAAA,CAAC,GAAG,SAAc,KAAA,CAAA,CAAE,MAAO,CAAA,SAAS,CAAE,CAAA;AAAA,KAAA;AAEpF,IAAA,MAAM,YAAgC,GAAA;AAAA,MACpC,MAAQ,EAAA;AAAA,QACN,MAAQ,EAAA,QAAA;AAAA,QACR,IAAM,EAAA,QAAA;AAAA,QACN,IAAM,EAAA,CAAC,SAAa,IAAA,SAAA,GAAY,YAAa,KAAY,CAAA,GAAA,SAAA;AAAA,QACzD,MAAQ,EAAA;AAAA;AACV,KACF;AAEA,IAAA,IAAI,iBAAiB,IAAM,EAAA;AACzB,MAAA,YAAA,CAAa,OAAQ,IAAO,GAAA,aAAA;AAAA,KACvB,MAAA;AAEL,MAAI,IAAA,SAAA,KAAc,eAAe,MAAQ,EAAA;AACvC,QAAA,YAAA,CAAa,OAAQ,IAAO,GAAA,IAAA;AAAA,OACvB,MAAA;AACL,QAAI,IAAA,UAAA,KAAe,eAAe,IAAM,EAAA;AACtC,UAAI,IAAA,SAAA,KAAc,eAAe,IAAM,EAAA;AACrC,YAAA,YAAA,CAAa,OAAQ,IAAO,GAAA,KAAA;AAAA;AAC9B,SACF,MAAA,IAAW,UAAe,KAAA,cAAA,CAAe,KAAO,EAAA;AAC9C,UAAA,YAAA,CAAa,OAAQ,IAAO,GAAA,KAAA;AAAA,SAC9B,MAAA,IAAW,UAAe,KAAA,cAAA,CAAe,MAAQ,EAAA;AAC/C,UAAA,YAAA,CAAa,OAAQ,IAAO,GAAA,IAAA;AAAA;AAC9B;AACF;AAGF,IAAO,OAAA;AAAA,MACL,KAAO,EAAA,QAAA;AAAA,MACP,MAAA;AAAA,MACA,QAAU,EAAA,OAAO,SAAc,KAAA,QAAA,GAAW,KAAQ,GAAA,SAAA;AAAA,MAClD,OAAO,MAAM,EAAA;AAAA,MACb,OAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA,EAAM,KAAK,OAAQ,EAAA;AAAA,MACnB,GAAG,UAAA;AAAA,MACH,GAAG;AAAA,KACL;AAAA;AACF,EAEQ,YAA8B,GAAA;AACpC,IAAM,MAAA;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,IAAK,CAAA,KAAA;AAET,IAAI,IAAA,YAAA,KAAiB,iBAAkB,CAAA,IAAA,IAAQ,kBAAoB,EAAA;AACjE,MAAO,OAAA,CAAC,MAAa,SAAmB,KAAA;AAvK9C,QAAA,IAAA,EAAA,EAAA,EAAA;AAuKiD,QAAA,OAAA,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,kBAAA,CAAmB,SAAS,CAAA,KAA5B,IAAiC,GAAA,EAAA,GAAA,SAAA,KAAjC,IAA8C,GAAA,EAAA,GAAA,cAAA;AAAA,OAAA;AAAA;AAG3F,IAAA,IAAI,iBAAiB,iBAAkB,CAAA,MAAA,IAAA,CAAU,SAAW,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,SAAA,CAAA,EAAA,MAAO,iBAAiB,KAAO,EAAA;AACzF,MAAO,OAAA,kBAAA,CAAmB,GAAG,KAAO,EAAA,SAAA,EAAW,YAAY,OAAS,EAAA,OAAA,EAAS,SAAS,OAAO,CAAA;AAAA;AAG/F,IAAI,IAAA,YAAA,KAAiB,kBAAkB,GAAK,EAAA;AAC1C,MAAA,OAAO,gBAAiB,CAAA,SAAA,IAAA,IAAA,GAAA,SAAA,GAAa,cAAgB,EAAA,CAAA,EAAG,KAAK,CAAA;AAAA;AAG/D,IAAA,OAAO,SAAa,IAAA,IAAA,GAAA,SAAA,GAAA,cAAA;AAAA;AACtB,EAEQ,OAAmC,GAAA;AACzC,IAAM,MAAA;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,IAAK,CAAA,KAAA;AAET,IAAA,IAAI,SAAW,EAAA;AACb,MAAO,OAAA,SAAA;AAAA;AAGT,IAAM,MAAA,IAAA,GAAO,sCAAgB,iBAAkB,CAAA,IAAA;AAC/C,IAAM,MAAA,cAAA,GAAA,CAAkB,oCAAe,CAAK,IAAA,GAAA;AAE5C,IAAA,IAAI,IAAS,KAAA,iBAAA,CAAkB,IAAQ,IAAA,kBAAA,IAAsB,iBAAiB,CAAG,EAAA;AAC/E,MAAO,OAAA,CAAC,GAAU,SAAsB,KAAA;AAEtC,QAAA,IAAIA,UAAY,GAAA,CAAA,CAAE,MAAO,CAAA,SAAS,CAAE,CAAA,OAAA;AACpC,QAAA,OAAO,iBAAiB,KAAMA,CAAAA,UAAAA,IAAA,IAAAA,GAAAA,UAAAA,GAAa,IAAI,cAAc,CAAA;AAAA,OAC/D;AAAA;AAGF,IAAA,QAAQ,IAAM;AAAA,MACZ,KAAK,iBAAkB,CAAA,OAAA;AACrB,QAAO,OAAA,oBAAA,CAAsB,SAAa,IAAA,IAAA,GAAA,SAAA,GAAA,SAAA,EAAa,cAAc,CAAA;AAAA,MACvE,KAAK,iBAAkB,CAAA,GAAA;AACrB,QAAA,OAAO,gBAAkB,CAAA,SAAA,IAAA,IAAA,GAAA,SAAA,GAAa,SAAa,EAAA,cAAA,EAAgB,KAAK,CAAA;AAAA,MAC1E,KAAK,iBAAkB,CAAA,MAAA;AACrB,QAAI,IAAA,CAAA,SAAA,IAAA,IAAA,GAAA,KAAA,CAAA,GAAA,SAAA,CAAW,EAAO,MAAA,gBAAA,CAAiB,KAAO,EAAA;AAC5C,UAAO,OAAA,kBAAA,CAAmB,gBAAgB,KAAO,EAAA,SAAA,EAAW,YAAY,OAAS,EAAA,OAAA,EAAS,SAAS,OAAO,CAAA;AAAA;AAC5G;AAAA,MAEF;AACE,QAAA,IAAI,iBAAiB,CAAG,EAAA;AACtB,UAAA,OAAO,gBAAiB,CAAA,KAAA,CAAM,SAAa,IAAA,IAAA,GAAA,SAAA,GAAA,EAAA,EAAI,cAAc,CAAA;AAAA;AAC/D;AAGJ,IAAO,OAAA,KAAA,CAAA;AAAA;AAEX;AAUA,IAAI,QAAqC,GAAA,KAAA,CAAA;AAEzC,SAAS,yBAAA,CACP,OACA,iBACA,EAAA,YAAA,GAAe,aAAa,MAC5B,EAAA,cAAA,GAAiB,GACjB,EAAA,WAAA,GAAc,GACM,EAAA;AACpB,EAAA,MAAM,eAAe,KAAM,CAAA,KAAA;AAE3B,EAAA,IAAI,CAAC,QAAU,EAAA;AAEb,IAAW,QAAA,GAAA;AAAA,MACT,MAAA,EAAQ,aAAa,MAAQ,EAAA;AAAA,MAC7B,MAAA,EAAQ,aAAa,MAAQ,EAAA;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;AAGF,EAAI,IAAA,KAAA,KAAU,eAAe,IAAM,EAAA;AAEjC,IAAA,IAAI,aAAa,CAAQ,KAAA,EAAA,YAAY,CAAI,CAAA,EAAA,cAAc,IAAI,WAAW,CAAA,CAAA;AAEtE,IAAI,IAAA,CAAC,QAAS,CAAA,UAAU,CAAG,EAAA;AACzB,MAAS,QAAA,CAAA,UAAU,CAAI,GAAA,YAAA,CAAa,IAAM,CAAA;AAAA,QACxC,IAAA,EAAM,CAAC,cAAA,EAAgB,WAAW,CAAA;AAAA,QAClC,KAAO,EAAA;AAAA,OACR,CAAA;AAAA;AAGH,IAAA,OAAO,SAAS,UAAU,CAAA;AAAA,GAC5B,MAAA,IAAW,KAAU,KAAA,cAAA,CAAe,IAAM,EAAA;AACxC,IAAI,IAAA,iBAAA,KAAsB,kBAAkB,UAAY,EAAA;AACtD,MAAA,OAAO,QAAS,CAAA,UAAA;AAAA;AAElB,IAAI,IAAA,iBAAA,KAAsB,kBAAkB,SAAW,EAAA;AACrD,MAAA,OAAO,QAAS,CAAA,SAAA;AAAA;AAElB,IAAI,IAAA,iBAAA,KAAsB,kBAAkB,MAAQ,EAAA;AAClD,MAAA,OAAO,QAAS,CAAA,MAAA;AAAA;AAClB;AAGF,EAAA,OAAO,QAAS,CAAA,MAAA;AAClB;;;;"}