UNPKG

@grafana/ui

Version:
1 lines 15.9 kB
{"version":3,"file":"UPlotConfigBuilder.mjs","sources":["../../../../../src/components/uPlot/config/UPlotConfigBuilder.ts"],"sourcesContent":["import { merge } from 'lodash';\nimport uPlot, { Cursor, Band, Hooks, Select, AlignedData, Padding, Series } from 'uplot';\n\nimport { DataFrame, DefaultTimeZone, Field, getTimeZoneInfo, GrafanaTheme2, TimeRange, TimeZone } from '@grafana/data';\nimport { AxisPlacement, VizOrientation } from '@grafana/schema';\n\nimport { FacetedData, PlotConfig } from '../types';\nimport { DEFAULT_PLOT_CONFIG, getStackingBands, pluginLog, StackingGroup } from '../utils';\n\nimport { AxisProps, UPlotAxisBuilder } from './UPlotAxisBuilder';\nimport { ScaleProps, UPlotScaleBuilder } from './UPlotScaleBuilder';\nimport { SeriesProps, UPlotSeriesBuilder } from './UPlotSeriesBuilder';\nimport { getThresholdsDrawHook, UPlotThresholdOptions } from './UPlotThresholds';\n\nconst cursorDefaults: Cursor = {\n // prevent client-side zoom from triggering at the end of a selection\n drag: { setScale: false },\n points: {\n /*@ts-ignore*/\n size: (u, seriesIdx) => u.series[seriesIdx].points.size * 2,\n /*@ts-ignore*/\n width: (u, seriesIdx, size) => size / 4,\n },\n focus: {\n prox: 30,\n },\n};\n\ntype PrepData = (frames: DataFrame[]) => AlignedData | FacetedData;\ntype PreDataStacked = (frames: DataFrame[], stackingGroups: StackingGroup[]) => AlignedData | FacetedData;\n\nexport class UPlotConfigBuilder {\n readonly uid = Math.random().toString(36).slice(2);\n\n series: UPlotSeriesBuilder[] = [];\n private axes: Record<string, UPlotAxisBuilder> = {};\n readonly scales: UPlotScaleBuilder[] = [];\n private bands: Band[] = [];\n private stackingGroups: StackingGroup[] = [];\n private cursor: Cursor | undefined;\n private select: uPlot.Select | undefined;\n private hasLeftAxis = false;\n private hooks: Hooks.Arrays = {};\n private tz: string | undefined = undefined;\n private mode: uPlot.Mode = 1;\n private frames: DataFrame[] | undefined = undefined;\n // to prevent more than one threshold per scale\n private thresholds: Record<string, UPlotThresholdOptions> = {};\n private padding?: Padding = undefined;\n\n private cachedConfig?: PlotConfig;\n\n prepData: PrepData | undefined = undefined;\n\n constructor(timeZone: TimeZone = DefaultTimeZone) {\n this.tz = getTimeZoneInfo(timeZone, Date.now())?.ianaName;\n }\n\n // Exposed to let the container know the primary scale keys\n scaleKeys: [string, string] = ['', ''];\n\n addHook<T extends keyof Hooks.Defs>(type: T, hook: Hooks.Defs[T]) {\n pluginLog('UPlotConfigBuilder', false, 'addHook', type);\n\n if (!this.hooks[type]) {\n this.hooks[type] = [];\n }\n\n this.hooks[type].push(hook);\n }\n\n addThresholds(options: UPlotThresholdOptions) {\n if (!this.thresholds[options.scaleKey]) {\n this.thresholds[options.scaleKey] = options;\n this.addHook('drawClear', getThresholdsDrawHook(options));\n }\n }\n\n addAxis(props: AxisProps) {\n props.placement = props.placement ?? AxisPlacement.Auto;\n props.grid = props.grid ?? {};\n let scaleKey = props.scaleKey;\n\n if (scaleKey === 'x') {\n scaleKey += props.timeZone ?? '';\n }\n\n if (this.axes[scaleKey]) {\n this.axes[scaleKey].merge(props);\n return;\n }\n\n // Handle auto placement logic\n if (props.placement === AxisPlacement.Auto) {\n props.placement = this.hasLeftAxis ? AxisPlacement.Right : AxisPlacement.Left;\n }\n\n if (props.placement === AxisPlacement.Left) {\n this.hasLeftAxis = true;\n }\n\n if (props.placement === AxisPlacement.Hidden) {\n props.grid.show = false;\n props.size = 0;\n }\n\n this.axes[scaleKey] = new UPlotAxisBuilder(props);\n }\n\n getAxisPlacement(scaleKey: string): AxisPlacement {\n const axis = this.axes[scaleKey];\n return axis?.props.placement! ?? AxisPlacement.Left;\n }\n\n setCursor(cursor?: Cursor) {\n this.cursor = merge({}, this.cursor, cursor);\n }\n\n setMode(mode: uPlot.Mode) {\n this.mode = mode;\n }\n\n setSelect(select: Select) {\n this.select = select;\n }\n\n addSeries(props: SeriesProps) {\n this.series.push(new UPlotSeriesBuilder(props));\n }\n\n getSeries() {\n return this.series;\n }\n\n /** Add or update the scale with the scale key */\n addScale(props: ScaleProps) {\n const current = this.scales.find((v) => v.props.scaleKey === props.scaleKey);\n if (current) {\n current.merge(props);\n return;\n }\n this.scales.push(new UPlotScaleBuilder(props));\n }\n\n addBand(band: Band) {\n this.bands.push(band);\n }\n\n setStackingGroups(groups: StackingGroup[]) {\n this.stackingGroups = groups;\n }\n\n getStackingGroups() {\n return this.stackingGroups;\n }\n\n setPrepData(prepData: PreDataStacked) {\n this.prepData = (frames) => {\n this.frames = frames;\n return prepData(frames, this.getStackingGroups());\n };\n }\n\n setPadding(padding: Padding) {\n this.padding = padding;\n }\n\n getConfig() {\n if (this.cachedConfig) {\n return this.cachedConfig;\n }\n\n const config: PlotConfig = {\n ...DEFAULT_PLOT_CONFIG,\n mode: this.mode,\n series: [\n this.mode === 2\n ? (null as unknown as Series)\n : {\n value: () => '',\n },\n ],\n };\n config.axes = this.ensureNonOverlappingAxes(Object.values(this.axes)).map((a) => a.getConfig());\n config.series = [...config.series, ...this.series.map((s) => s.getConfig())];\n config.scales = this.scales.reduce((acc, s) => {\n return { ...acc, ...s.getConfig() };\n }, {});\n\n config.hooks = this.hooks;\n\n config.select = this.select;\n\n const pointColorFn =\n (alphaHex = '') =>\n (u: uPlot, seriesIdx: number) => {\n /*@ts-ignore*/\n let s = u.series[seriesIdx].points._stroke;\n\n // interpolate for gradients/thresholds\n if (typeof s !== 'string') {\n let field = this.frames![0].fields[seriesIdx];\n s = field.display!(field.values[u.cursor.idxs![seriesIdx]!]).color!;\n }\n\n return s + alphaHex;\n };\n\n config.cursor = merge(\n {},\n cursorDefaults,\n {\n points: {\n stroke: pointColorFn('80'),\n fill: pointColorFn(),\n },\n },\n this.cursor\n );\n\n config.tzDate = this.tzDate;\n\n if (Array.isArray(this.padding)) {\n config.padding = this.padding;\n }\n\n this.stackingGroups.forEach((group) => {\n getStackingBands(group).forEach((band) => {\n this.addBand(band);\n });\n });\n\n if (this.bands.length) {\n config.bands = this.bands;\n }\n\n this.cachedConfig = config;\n\n return config;\n }\n\n private tzDate = (ts: number) => {\n let date = new Date(ts);\n\n return this.tz ? uPlot.tzDate(date, this.tz) : date;\n };\n\n private ensureNonOverlappingAxes(axes: UPlotAxisBuilder[]): UPlotAxisBuilder[] {\n const xAxis = axes.find((a) => a.props.scaleKey === 'x');\n const axesWithoutGridSet = axes.filter((a) => a.props.grid?.show === undefined);\n const firstValueAxisIdx = axesWithoutGridSet.findIndex(\n (a) =>\n a.props.placement === AxisPlacement.Left ||\n a.props.placement === AxisPlacement.Right ||\n (a.props.placement === AxisPlacement.Bottom && a !== xAxis)\n );\n\n // For all axes with no grid set, set the grid automatically (grid only for first left axis )\n for (let i = 0; i < axesWithoutGridSet.length; i++) {\n if (axesWithoutGridSet[i] === xAxis || i === firstValueAxisIdx) {\n axesWithoutGridSet[i].props.grid!.show = true;\n } else {\n axesWithoutGridSet[i].props.grid!.show = false;\n }\n }\n\n return axes;\n }\n}\n\nexport type Renderers = Array<{\n fieldMap: Record<string, string>;\n indicesOnly: string[];\n init: (config: UPlotConfigBuilder, fieldIndices: Record<string, number>) => void;\n}>;\n\n/** @alpha */\ntype UPlotConfigPrepOpts<T extends Record<string, unknown> = {}> = {\n frame: DataFrame;\n theme: GrafanaTheme2;\n timeZones: TimeZone[];\n getTimeRange: () => TimeRange;\n allFrames: DataFrame[];\n renderers?: Renderers;\n tweakScale?: (opts: ScaleProps, forField: Field) => ScaleProps;\n tweakAxis?: (opts: AxisProps, forField: Field) => AxisProps;\n hoverProximity?: number;\n orientation?: VizOrientation;\n} & T;\n\n/** @alpha */\nexport type UPlotConfigPrepFn<T extends {} = {}> = (opts: UPlotConfigPrepOpts<T>) => UPlotConfigBuilder;\n"],"names":[],"mappings":"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"}