UNPKG

@grafana/ui

Version:
1 lines 15.7 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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"}