{"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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"}