{"version":3,"file":"utils.mjs","sources":["../../../../src/graveyard/TimeSeries/utils.ts"],"sourcesContent":["import { isNumber } from 'lodash';\nimport uPlot from 'uplot';\n\nimport {\n  DashboardCursorSync,\n  DataFrame,\n  FieldConfig,\n  FieldType,\n  formattedValueToString,\n  getFieldColorModeForField,\n  getFieldSeriesColor,\n  getFieldDisplayName,\n  getDisplayProcessor,\n  FieldColorModeId,\n  DecimalCount,\n} from '@grafana/data';\nimport {\n  AxisPlacement,\n  GraphDrawStyle,\n  GraphFieldConfig,\n  GraphThresholdsStyleMode,\n  VisibilityMode,\n  ScaleDirection,\n  ScaleOrientation,\n  StackingMode,\n  GraphTransform,\n  AxisColorMode,\n  GraphGradientMode,\n} from '@grafana/schema';\n\n// unit lookup needed to determine if we want power-of-2 or power-of-10 axis ticks\n// see categories.ts is @grafana/data\nconst IEC_UNITS = new Set([\n  'bytes',\n  'bits',\n  'kbytes',\n  'mbytes',\n  'gbytes',\n  'tbytes',\n  'pbytes',\n  'binBps',\n  'binbps',\n  'KiBs',\n  'Kibits',\n  'MiBs',\n  'Mibits',\n  'GiBs',\n  'Gibits',\n  'TiBs',\n  'Tibits',\n  'PiBs',\n  'Pibits',\n]);\n\nconst BIN_INCRS = Array(53);\n\nfor (let i = 0; i < BIN_INCRS.length; i++) {\n  BIN_INCRS[i] = 2 ** i;\n}\n\nimport { UPlotConfigBuilder, UPlotConfigPrepFn } from '../../components/uPlot/config/UPlotConfigBuilder';\nimport { getScaleGradientFn } from '../../components/uPlot/config/gradientFills';\nimport { getStackingGroups, preparePlotData2 } from '../../components/uPlot/utils';\nimport { buildScaleKey } from '../GraphNG/utils';\n\nconst defaultFormatter = (v: any, decimals: DecimalCount = 1) => (v == null ? '-' : v.toFixed(decimals));\n\nconst defaultConfig: GraphFieldConfig = {\n  drawStyle: GraphDrawStyle.Line,\n  showPoints: VisibilityMode.Auto,\n  axisPlacement: AxisPlacement.Auto,\n};\n\nexport const preparePlotConfigBuilder: UPlotConfigPrepFn<{\n  sync?: () => DashboardCursorSync;\n}> = ({\n  frame,\n  theme,\n  timeZones,\n  getTimeRange,\n  sync,\n  allFrames,\n  renderers,\n  tweakScale = (opts) => opts,\n  tweakAxis = (opts) => opts,\n}) => {\n  const eventsScope = '__global_';\n\n  const builder = new UPlotConfigBuilder(timeZones[0]);\n\n  let alignedFrame: DataFrame;\n\n  builder.setPrepData((frames) => {\n    // cache alignedFrame\n    alignedFrame = frames[0];\n\n    return preparePlotData2(frames[0], builder.getStackingGroups());\n  });\n\n  // X is the first field in the aligned frame\n  const xField = frame.fields[0];\n  if (!xField) {\n    return builder; // empty frame with no options\n  }\n\n  const xScaleKey = 'x';\n  let yScaleKey = '';\n\n  const xFieldAxisPlacement =\n    xField.config.custom?.axisPlacement !== AxisPlacement.Hidden ? AxisPlacement.Bottom : AxisPlacement.Hidden;\n  const xFieldAxisShow = xField.config.custom?.axisPlacement !== AxisPlacement.Hidden;\n\n  if (xField.type === FieldType.time) {\n    builder.addScale({\n      scaleKey: xScaleKey,\n      orientation: ScaleOrientation.Horizontal,\n      direction: ScaleDirection.Right,\n      isTime: true,\n      range: () => {\n        const r = getTimeRange();\n        return [r.from.valueOf(), r.to.valueOf()];\n      },\n    });\n\n    // filters first 2 ticks to make space for timezone labels\n    const filterTicks: uPlot.Axis.Filter | undefined =\n      timeZones.length > 1\n        ? (u, splits) => {\n            return splits.map((v, i) => (i < 2 ? null : v));\n          }\n        : undefined;\n\n    for (let i = 0; i < timeZones.length; i++) {\n      const timeZone = timeZones[i];\n      builder.addAxis({\n        scaleKey: xScaleKey,\n        isTime: true,\n        placement: xFieldAxisPlacement,\n        show: xFieldAxisShow,\n        label: xField.config.custom?.axisLabel,\n        timeZone,\n        theme,\n        grid: { show: i === 0 && xField.config.custom?.axisGridShow },\n        filter: filterTicks,\n      });\n    }\n\n    // render timezone labels\n    if (timeZones.length > 1) {\n      builder.addHook('drawAxes', (u: uPlot) => {\n        u.ctx.save();\n\n        u.ctx.fillStyle = theme.colors.text.primary;\n        u.ctx.textAlign = 'left';\n        u.ctx.textBaseline = 'bottom';\n\n        let i = 0;\n        u.axes.forEach((a) => {\n          if (a.side === 2) {\n            //@ts-ignore\n            let cssBaseline: number = a._pos + a._size;\n            u.ctx.fillText(timeZones[i], u.bbox.left, cssBaseline * uPlot.pxRatio);\n            i++;\n          }\n        });\n\n        u.ctx.restore();\n      });\n    }\n  } else {\n    builder.addScale({\n      scaleKey: xScaleKey,\n      orientation: ScaleOrientation.Horizontal,\n      direction: ScaleDirection.Right,\n      range: (u, dataMin, dataMax) => [xField.config.min ?? dataMin, xField.config.max ?? dataMax],\n    });\n\n    builder.addAxis({\n      scaleKey: xScaleKey,\n      placement: xFieldAxisPlacement,\n      show: xFieldAxisShow,\n      label: xField.config.custom?.axisLabel,\n      theme,\n      grid: { show: xField.config.custom?.axisGridShow },\n      formatValue: (v, decimals) => formattedValueToString(xField.display!(v, decimals)),\n    });\n  }\n\n  let customRenderedFields =\n    renderers?.flatMap((r) => Object.values(r.fieldMap).filter((name) => r.indicesOnly.indexOf(name) === -1)) ?? [];\n\n  let indexByName: Map<string, number> | undefined;\n\n  for (let i = 1; i < frame.fields.length; i++) {\n    const field = frame.fields[i];\n\n    const config: FieldConfig<GraphFieldConfig> = {\n      ...field.config,\n      custom: {\n        ...defaultConfig,\n        ...field.config.custom,\n      },\n    };\n\n    const customConfig: GraphFieldConfig = config.custom!;\n\n    if (field === xField || (field.type !== FieldType.number && field.type !== FieldType.enum)) {\n      continue;\n    }\n\n    let fmt = field.display ?? defaultFormatter;\n    if (field.config.custom?.stacking?.mode === StackingMode.Percent) {\n      fmt = getDisplayProcessor({\n        field: {\n          ...field,\n          config: {\n            ...field.config,\n            unit: 'percentunit',\n          },\n        },\n        theme,\n      });\n    }\n    const scaleKey = buildScaleKey(config, field.type);\n    const colorMode = getFieldColorModeForField(field);\n    const scaleColor = getFieldSeriesColor(field, theme);\n    const seriesColor = scaleColor.color;\n\n    // The builder will manage unique scaleKeys and combine where appropriate\n    builder.addScale(\n      tweakScale(\n        {\n          scaleKey,\n          orientation: ScaleOrientation.Vertical,\n          direction: ScaleDirection.Up,\n          distribution: customConfig.scaleDistribution?.type,\n          log: customConfig.scaleDistribution?.log,\n          linearThreshold: customConfig.scaleDistribution?.linearThreshold,\n          min: field.config.min,\n          max: field.config.max,\n          softMin: customConfig.axisSoftMin,\n          softMax: customConfig.axisSoftMax,\n          centeredZero: customConfig.axisCenteredZero,\n          range:\n            customConfig.stacking?.mode === StackingMode.Percent\n              ? (u: uPlot, dataMin: number, dataMax: number) => {\n                  dataMin = dataMin < 0 ? -1 : 0;\n                  dataMax = dataMax > 0 ? 1 : 0;\n                  return [dataMin, dataMax];\n                }\n              : field.type === FieldType.enum\n                ? (u: uPlot, dataMin: number, dataMax: number) => {\n                    // this is the exhaustive enum (stable)\n                    let len = field.config.type!.enum!.text!.length;\n\n                    return [-1, len];\n\n                    // these are only values that are present\n                    // return [dataMin - 1, dataMax + 1]\n                  }\n                : undefined,\n          decimals: field.config.decimals,\n        },\n        field\n      )\n    );\n\n    if (!yScaleKey) {\n      yScaleKey = scaleKey;\n    }\n\n    if (customConfig.axisPlacement !== AxisPlacement.Hidden) {\n      let axisColor: uPlot.Axis.Stroke | undefined;\n\n      if (customConfig.axisColorMode === AxisColorMode.Series) {\n        if (\n          colorMode.isByValue &&\n          field.config.custom?.gradientMode === GraphGradientMode.Scheme &&\n          colorMode.id === FieldColorModeId.Thresholds\n        ) {\n          axisColor = getScaleGradientFn(1, theme, colorMode, field.config.thresholds);\n        } else {\n          axisColor = seriesColor;\n        }\n      }\n\n      const axisDisplayOptions = {\n        border: {\n          show: customConfig.axisBorderShow || false,\n          width: 1 / devicePixelRatio,\n          stroke: axisColor || theme.colors.text.primary,\n        },\n        ticks: {\n          show: customConfig.axisBorderShow || false,\n          stroke: axisColor || theme.colors.text.primary,\n        },\n        color: axisColor || theme.colors.text.primary,\n      };\n\n      let incrs: uPlot.Axis.Incrs | undefined;\n\n      // TODO: these will be dynamic with frame updates, so need to accept getYTickLabels()\n      let values: uPlot.Axis.Values | undefined;\n      let splits: uPlot.Axis.Splits | undefined;\n\n      if (IEC_UNITS.has(config.unit!)) {\n        incrs = BIN_INCRS;\n      } else if (field.type === FieldType.enum) {\n        let text = field.config.type!.enum!.text!;\n        splits = text.map((v: string, i: number) => i);\n        values = text;\n      }\n\n      builder.addAxis(\n        tweakAxis(\n          {\n            scaleKey,\n            label: customConfig.axisLabel,\n            size: customConfig.axisWidth,\n            placement: customConfig.axisPlacement ?? AxisPlacement.Auto,\n            formatValue: (v, decimals) => formattedValueToString(fmt(v, decimals)),\n            theme,\n            grid: { show: customConfig.axisGridShow },\n            decimals: field.config.decimals,\n            distr: customConfig.scaleDistribution?.type,\n            splits,\n            values,\n            incrs,\n            ...axisDisplayOptions,\n          },\n          field\n        )\n      );\n    }\n\n    const showPoints =\n      customConfig.drawStyle === GraphDrawStyle.Points ? VisibilityMode.Always : customConfig.showPoints;\n\n    let pointsFilter: uPlot.Series.Points.Filter = () => null;\n\n    if (customConfig.spanNulls !== true) {\n      pointsFilter = (u, seriesIdx, show, gaps) => {\n        let filtered = [];\n\n        let series = u.series[seriesIdx];\n\n        if (!show && gaps && gaps.length) {\n          const [firstIdx, lastIdx] = series.idxs!;\n          const xData = u.data[0];\n          const yData = u.data[seriesIdx];\n          const firstPos = Math.round(u.valToPos(xData[firstIdx], 'x', true));\n          const lastPos = Math.round(u.valToPos(xData[lastIdx], 'x', true));\n\n          if (gaps[0][0] === firstPos) {\n            filtered.push(firstIdx);\n          }\n\n          // show single points between consecutive gaps that share end/start\n          for (let i = 0; i < gaps.length; i++) {\n            let thisGap = gaps[i];\n            let nextGap = gaps[i + 1];\n\n            if (nextGap && thisGap[1] === nextGap[0]) {\n              // approx when data density is > 1pt/px, since gap start/end pixels are rounded\n              let approxIdx = u.posToIdx(thisGap[1], true);\n\n              if (yData[approxIdx] == null) {\n                // scan left/right alternating to find closest index with non-null value\n                for (let j = 1; j < 100; j++) {\n                  if (yData[approxIdx + j] != null) {\n                    approxIdx += j;\n                    break;\n                  }\n                  if (yData[approxIdx - j] != null) {\n                    approxIdx -= j;\n                    break;\n                  }\n                }\n              }\n\n              filtered.push(approxIdx);\n            }\n          }\n\n          if (gaps[gaps.length - 1][1] === lastPos) {\n            filtered.push(lastIdx);\n          }\n        }\n\n        return filtered.length ? filtered : null;\n      };\n    }\n\n    let { fillOpacity } = customConfig;\n\n    let pathBuilder: uPlot.Series.PathBuilder | null = null;\n    let pointsBuilder: uPlot.Series.Points.Show | null = null;\n\n    if (field.state?.origin) {\n      if (!indexByName) {\n        indexByName = getNamesToFieldIndex(frame, allFrames);\n      }\n\n      const originFrame = allFrames[field.state.origin.frameIndex];\n      const originField = originFrame?.fields[field.state.origin.fieldIndex];\n\n      const dispName = getFieldDisplayName(originField ?? field, originFrame, allFrames);\n\n      // disable default renderers\n      if (customRenderedFields.indexOf(dispName) >= 0) {\n        pathBuilder = () => null;\n        pointsBuilder = () => undefined;\n      } else if (customConfig.transform === GraphTransform.Constant) {\n        // patch some monkeys!\n        const defaultBuilder = uPlot.paths!.linear!();\n\n        pathBuilder = (u, seriesIdx) => {\n          //eslint-disable-next-line\n          const _data: any[] = (u as any)._data; // uplot.AlignedData not exposed in types\n\n          // the data we want the line renderer to pull is x at each plot edge with paired flat y values\n\n          const r = getTimeRange();\n          let xData = [r.from.valueOf(), r.to.valueOf()];\n          let firstY = _data[seriesIdx].find((v: number | null | undefined) => v != null);\n          let yData = [firstY, firstY];\n          let fauxData = _data.slice();\n          fauxData[0] = xData;\n          fauxData[seriesIdx] = yData;\n\n          //eslint-disable-next-line\n          return defaultBuilder(\n            {\n              ...u,\n              _data: fauxData,\n            } as any,\n            seriesIdx,\n            0,\n            1\n          );\n        };\n      }\n\n      if (customConfig.fillBelowTo) {\n        const fillBelowToField = frame.fields.find(\n          (f) =>\n            customConfig.fillBelowTo === f.name ||\n            customConfig.fillBelowTo === f.config?.displayNameFromDS ||\n            customConfig.fillBelowTo === getFieldDisplayName(f, frame, allFrames)\n        );\n\n        const fillBelowDispName = fillBelowToField\n          ? getFieldDisplayName(fillBelowToField, frame, allFrames)\n          : customConfig.fillBelowTo;\n\n        const t = indexByName.get(dispName);\n        const b = indexByName.get(fillBelowDispName);\n        if (isNumber(b) && isNumber(t)) {\n          builder.addBand({\n            series: [t, b],\n            fill: undefined, // using null will have the band use fill options from `t`\n          });\n\n          if (!fillOpacity) {\n            fillOpacity = 35; // default from flot\n          }\n        } else {\n          fillOpacity = 0;\n        }\n      }\n    }\n\n    let dynamicSeriesColor: ((seriesIdx: number) => string | undefined) | undefined = undefined;\n\n    if (colorMode.id === FieldColorModeId.Thresholds) {\n      dynamicSeriesColor = (seriesIdx) => getFieldSeriesColor(alignedFrame.fields[seriesIdx], theme).color;\n    }\n\n    builder.addSeries({\n      pathBuilder,\n      pointsBuilder,\n      scaleKey,\n      showPoints,\n      pointsFilter,\n      colorMode,\n      fillOpacity,\n      theme,\n      dynamicSeriesColor,\n      drawStyle: customConfig.drawStyle!,\n      lineColor: customConfig.lineColor ?? seriesColor,\n      lineWidth: customConfig.lineWidth,\n      lineInterpolation: customConfig.lineInterpolation,\n      lineStyle: customConfig.lineStyle,\n      barAlignment: customConfig.barAlignment,\n      barWidthFactor: customConfig.barWidthFactor,\n      barMaxWidth: customConfig.barMaxWidth,\n      pointSize: customConfig.pointSize,\n      spanNulls: customConfig.spanNulls || false,\n      show: !customConfig.hideFrom?.viz,\n      gradientMode: customConfig.gradientMode,\n      thresholds: config.thresholds,\n      hardMin: field.config.min,\n      hardMax: field.config.max,\n      softMin: customConfig.axisSoftMin,\n      softMax: customConfig.axisSoftMax,\n      // The following properties are not used in the uPlot config, but are utilized as transport for legend config\n      dataFrameFieldIndex: field.state?.origin,\n    });\n\n    // Render thresholds in graph\n    if (customConfig.thresholdsStyle && config.thresholds) {\n      const thresholdDisplay = customConfig.thresholdsStyle.mode ?? GraphThresholdsStyleMode.Off;\n      if (thresholdDisplay !== GraphThresholdsStyleMode.Off) {\n        builder.addThresholds({\n          config: customConfig.thresholdsStyle,\n          thresholds: config.thresholds,\n          scaleKey,\n          theme,\n          hardMin: field.config.min,\n          hardMax: field.config.max,\n          softMin: customConfig.axisSoftMin,\n          softMax: customConfig.axisSoftMax,\n        });\n      }\n    }\n  }\n\n  let stackingGroups = getStackingGroups(frame);\n\n  builder.setStackingGroups(stackingGroups);\n\n  // hook up custom/composite renderers\n  renderers?.forEach((r) => {\n    if (!indexByName) {\n      indexByName = getNamesToFieldIndex(frame, allFrames);\n    }\n    let fieldIndices: Record<string, number> = {};\n\n    for (let key in r.fieldMap) {\n      let dispName = r.fieldMap[key];\n      fieldIndices[key] = indexByName.get(dispName)!;\n    }\n\n    r.init(builder, fieldIndices);\n  });\n\n  builder.scaleKeys = [xScaleKey, yScaleKey];\n\n  // if hovered value is null, how far we may scan left/right to hover nearest non-null\n  const hoverProximityPx = 15;\n\n  let cursor: Partial<uPlot.Cursor> = {\n    // this scans left and right from cursor position to find nearest data index with value != null\n    // TODO: do we want to only scan past undefined values, but halt at explicit null values?\n    dataIdx: (self, seriesIdx, hoveredIdx, cursorXVal) => {\n      let seriesData = self.data[seriesIdx];\n\n      if (seriesData[hoveredIdx] == null) {\n        let nonNullLft = null,\n          nonNullRgt = null,\n          i;\n\n        i = hoveredIdx;\n        while (nonNullLft == null && i-- > 0) {\n          if (seriesData[i] != null) {\n            nonNullLft = i;\n          }\n        }\n\n        i = hoveredIdx;\n        while (nonNullRgt == null && i++ < seriesData.length) {\n          if (seriesData[i] != null) {\n            nonNullRgt = i;\n          }\n        }\n\n        let xVals = self.data[0];\n\n        let curPos = self.valToPos(cursorXVal, 'x');\n        let rgtPos = nonNullRgt == null ? Infinity : self.valToPos(xVals[nonNullRgt], 'x');\n        let lftPos = nonNullLft == null ? -Infinity : self.valToPos(xVals[nonNullLft], 'x');\n\n        let lftDelta = curPos - lftPos;\n        let rgtDelta = rgtPos - curPos;\n\n        if (lftDelta <= rgtDelta) {\n          if (lftDelta <= hoverProximityPx) {\n            hoveredIdx = nonNullLft!;\n          }\n        } else {\n          if (rgtDelta <= hoverProximityPx) {\n            hoveredIdx = nonNullRgt!;\n          }\n        }\n      }\n\n      return hoveredIdx;\n    },\n  };\n\n  if (sync && sync() !== DashboardCursorSync.Off) {\n    cursor.sync = {\n      key: eventsScope,\n      scales: [xScaleKey, null],\n    };\n  }\n\n  builder.setCursor(cursor);\n\n  return builder;\n};\n\nexport function getNamesToFieldIndex(frame: DataFrame, allFrames: DataFrame[]): Map<string, number> {\n  const originNames = new Map<string, number>();\n  frame.fields.forEach((field, i) => {\n    const origin = field.state?.origin;\n    if (origin) {\n      const origField = allFrames[origin.frameIndex]?.fields[origin.fieldIndex];\n      if (origField) {\n        originNames.set(getFieldDisplayName(origField, allFrames[origin.frameIndex], allFrames), i);\n      }\n    }\n  });\n  return originNames;\n}\n"],"names":["_a","_b","i"],"mappings":"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"}