UNPKG

@grafana/ui

Version:
1 lines 14.7 kB
{"version":3,"file":"UPlotSeriesBuilder.cjs","sources":["../../../../../src/components/uPlot/config/UPlotSeriesBuilder.ts"],"sourcesContent":["import uPlot, { type Series } from 'uplot';\n\nimport {\n colorManipulator,\n type DataFrameFieldIndex,\n FALLBACK_COLOR,\n type FieldColorMode,\n FieldColorModeId,\n type GrafanaTheme2,\n type ThresholdsConfig,\n} from '@grafana/data';\nimport {\n BarAlignment,\n type BarConfig,\n GraphDrawStyle,\n type FillConfig,\n GraphGradientMode,\n type LineConfig,\n LineInterpolation,\n type 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":"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"}