{"version":3,"file":"SparklineCell.cjs","sources":["../../../../../src/components/Table/Cells/SparklineCell.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n  FieldType,\n  FieldConfig,\n  getMinMaxAndDelta,\n  FieldSparkline,\n  isDataFrame,\n  Field,\n  isDataFrameWithValue,\n  formattedValueToString,\n} from '@grafana/data';\nimport {\n  BarAlignment,\n  GraphDrawStyle,\n  GraphFieldConfig,\n  GraphGradientMode,\n  LineInterpolation,\n  TableSparklineCellOptions,\n  TableCellDisplayMode,\n  VisibilityMode,\n} from '@grafana/schema';\n\nimport { useTheme2 } from '../../../themes/ThemeContext';\nimport { measureText } from '../../../utils/measureText';\nimport { FormattedValueDisplay } from '../../FormattedValueDisplay/FormattedValueDisplay';\nimport { Sparkline } from '../../Sparkline/Sparkline';\nimport { TableCellProps } from '../types';\nimport { getAlignmentFactor, getCellOptions } from '../utils';\n\nexport const defaultSparklineCellConfig: TableSparklineCellOptions = {\n  type: TableCellDisplayMode.Sparkline,\n  drawStyle: GraphDrawStyle.Line,\n  lineInterpolation: LineInterpolation.Smooth,\n  lineWidth: 1,\n  fillOpacity: 17,\n  gradientMode: GraphGradientMode.Hue,\n  pointSize: 2,\n  barAlignment: BarAlignment.Center,\n  showPoints: VisibilityMode.Never,\n  hideValue: false,\n};\n\nexport const SparklineCell = (props: TableCellProps) => {\n  const { field, innerWidth, tableStyles, cell, cellProps, timeRange } = props;\n  const sparkline = getSparkline(cell.value);\n  const theme = useTheme2();\n\n  if (!sparkline) {\n    return (\n      <div {...cellProps} className={tableStyles.cellContainer}>\n        {field.config.noValue || 'no data'}\n      </div>\n    );\n  }\n\n  // Get the step from the first two values to null-fill the x-axis based on timerange\n  if (sparkline.x && !sparkline.x.config.interval && sparkline.x.values.length > 1) {\n    sparkline.x.config.interval = sparkline.x.values[1] - sparkline.x.values[0];\n  }\n\n  // Remove non-finite values, e.g: NaN, +/-Infinity\n  sparkline.y.values = sparkline.y.values.map((v) => {\n    if (!Number.isFinite(v)) {\n      return null;\n    } else {\n      return v;\n    }\n  });\n\n  const range = getMinMaxAndDelta(sparkline.y);\n  sparkline.y.config.min = range.min;\n  sparkline.y.config.max = range.max;\n  sparkline.y.state = { range };\n  sparkline.timeRange = timeRange;\n\n  const cellOptions = getTableSparklineCellOptions(field);\n\n  const config: FieldConfig<GraphFieldConfig> = {\n    color: field.config.color,\n    custom: {\n      ...defaultSparklineCellConfig,\n      ...cellOptions,\n    },\n  };\n\n  const hideValue = field.config.custom?.cellOptions?.hideValue;\n  let valueWidth = 0;\n  let valueElement: React.ReactNode = null;\n  if (!hideValue) {\n    const value = isDataFrameWithValue(cell.value) ? cell.value.value : null;\n    const displayValue = field.display!(value);\n    const alignmentFactor = getAlignmentFactor(field, displayValue, cell.row.index);\n\n    valueWidth = measureText(formattedValueToString(alignmentFactor), 16).width + theme.spacing.gridSize;\n\n    valueElement = (\n      <FormattedValueDisplay\n        style={{\n          width: `${valueWidth - theme.spacing.gridSize}px`,\n          textAlign: 'right',\n          marginRight: theme.spacing(1),\n        }}\n        value={displayValue}\n      />\n    );\n  }\n\n  return (\n    <div {...cellProps} className={tableStyles.cellContainer}>\n      {valueElement}\n      <div>\n        <Sparkline\n          width={innerWidth - valueWidth}\n          height={tableStyles.cellHeightInner}\n          sparkline={sparkline}\n          config={config}\n          theme={tableStyles.theme}\n        />\n      </div>\n    </div>\n  );\n};\n\nfunction getSparkline(value: unknown): FieldSparkline | undefined {\n  if (Array.isArray(value)) {\n    return {\n      y: {\n        name: 'test',\n        type: FieldType.number,\n        values: value,\n        config: {},\n      },\n    };\n  }\n\n  if (isDataFrame(value)) {\n    const timeField = value.fields.find((x) => x.type === FieldType.time);\n    const numberField = value.fields.find((x) => x.type === FieldType.number);\n\n    if (timeField && numberField) {\n      return { x: timeField, y: numberField };\n    }\n  }\n\n  return;\n}\n\nfunction getTableSparklineCellOptions(field: Field): TableSparklineCellOptions {\n  let options = getCellOptions(field);\n  if (options.type === TableCellDisplayMode.Auto) {\n    options = { ...options, type: TableCellDisplayMode.Sparkline };\n  }\n  if (options.type === TableCellDisplayMode.Sparkline) {\n    return options;\n  }\n  throw new Error(`Expected options type ${TableCellDisplayMode.Sparkline} but got ${options.type}`);\n}\n"],"names":["TableCellDisplayMode","GraphDrawStyle","LineInterpolation","GraphGradientMode","BarAlignment","VisibilityMode","useTheme2","jsx","getMinMaxAndDelta","isDataFrameWithValue","getAlignmentFactor","measureText","formattedValueToString","FormattedValueDisplay","Sparkline","FieldType","isDataFrame","getCellOptions"],"mappings":";;;;;;;;;;;;;;AA8BO,MAAM,0BAAA,GAAwD;AAAA,EACnE,MAAMA,2BAAA,CAAqB,SAAA;AAAA,EAC3B,WAAWC,qBAAA,CAAe,IAAA;AAAA,EAC1B,mBAAmBC,wBAAA,CAAkB,MAAA;AAAA,EACrC,SAAA,EAAW,CAAA;AAAA,EACX,WAAA,EAAa,EAAA;AAAA,EACb,cAAcC,wBAAA,CAAkB,GAAA;AAAA,EAChC,SAAA,EAAW,CAAA;AAAA,EACX,cAAcC,mBAAA,CAAa,MAAA;AAAA,EAC3B,YAAYC,qBAAA,CAAe,KAAA;AAAA,EAC3B,SAAA,EAAW;AACb;AAEO,MAAM,aAAA,GAAgB,CAAC,KAAA,KAA0B;AA3CxD,EAAA,IAAA,EAAA,EAAA,EAAA;AA4CE,EAAA,MAAM,EAAE,KAAA,EAAO,UAAA,EAAY,aAAa,IAAA,EAAM,SAAA,EAAW,WAAU,GAAI,KAAA;AACvE,EAAA,MAAM,SAAA,GAAY,YAAA,CAAa,IAAA,CAAK,KAAK,CAAA;AACzC,EAAA,MAAM,QAAQC,sBAAA,EAAU;AAExB,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,uBACEC,cAAA,CAAC,KAAA,EAAA,EAAK,GAAG,SAAA,EAAW,SAAA,EAAW,YAAY,aAAA,EACxC,QAAA,EAAA,KAAA,CAAM,MAAA,CAAO,OAAA,IAAW,SAAA,EAC3B,CAAA;AAAA,EAEJ;AAGA,EAAA,IAAI,SAAA,CAAU,CAAA,IAAK,CAAC,SAAA,CAAU,CAAA,CAAE,MAAA,CAAO,QAAA,IAAY,SAAA,CAAU,CAAA,CAAE,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAChF,IAAA,SAAA,CAAU,CAAA,CAAE,MAAA,CAAO,QAAA,GAAW,SAAA,CAAU,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,GAAI,SAAA,CAAU,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA;AAAA,EAC5E;AAGA,EAAA,SAAA,CAAU,EAAE,MAAA,GAAS,SAAA,CAAU,EAAE,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AACjD,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,EAAG;AACvB,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,MAAO;AACL,MAAA,OAAO,CAAA;AAAA,IACT;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,KAAA,GAAQC,sBAAA,CAAkB,SAAA,CAAU,CAAC,CAAA;AAC3C,EAAA,SAAA,CAAU,CAAA,CAAE,MAAA,CAAO,GAAA,GAAM,KAAA,CAAM,GAAA;AAC/B,EAAA,SAAA,CAAU,CAAA,CAAE,MAAA,CAAO,GAAA,GAAM,KAAA,CAAM,GAAA;AAC/B,EAAA,SAAA,CAAU,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAA,EAAM;AAC5B,EAAA,SAAA,CAAU,SAAA,GAAY,SAAA;AAEtB,EAAA,MAAM,WAAA,GAAc,6BAA6B,KAAK,CAAA;AAEtD,EAAA,MAAM,MAAA,GAAwC;AAAA,IAC5C,KAAA,EAAO,MAAM,MAAA,CAAO,KAAA;AAAA,IACpB,MAAA,EAAQ;AAAA,MACN,GAAG,0BAAA;AAAA,MACH,GAAG;AAAA;AACL,GACF;AAEA,EAAA,MAAM,aAAY,EAAA,GAAA,CAAA,EAAA,GAAA,KAAA,CAAM,MAAA,CAAO,MAAA,KAAb,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAqB,gBAArB,IAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAkC,SAAA;AACpD,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,YAAA,GAAgC,IAAA;AACpC,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,MAAM,QAAQC,yBAAA,CAAqB,IAAA,CAAK,KAAK,CAAA,GAAI,IAAA,CAAK,MAAM,KAAA,GAAQ,IAAA;AACpE,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,OAAA,CAAS,KAAK,CAAA;AACzC,IAAA,MAAM,kBAAkBC,wBAAA,CAAmB,KAAA,EAAO,YAAA,EAAc,IAAA,CAAK,IAAI,KAAK,CAAA;AAE9E,IAAA,UAAA,GAAaC,uBAAA,CAAYC,4BAAuB,eAAe,CAAA,EAAG,EAAE,CAAA,CAAE,KAAA,GAAQ,MAAM,OAAA,CAAQ,QAAA;AAE5F,IAAA,YAAA,mBACEL,cAAA;AAAA,MAACM,2CAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO;AAAA,UACL,KAAA,EAAO,CAAA,EAAG,UAAA,GAAa,KAAA,CAAM,QAAQ,QAAQ,CAAA,EAAA,CAAA;AAAA,UAC7C,SAAA,EAAW,OAAA;AAAA,UACX,WAAA,EAAa,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,SAC9B;AAAA,QACA,KAAA,EAAO;AAAA;AAAA,KACT;AAAA,EAEJ;AAEA,EAAA,uCACG,KAAA,EAAA,EAAK,GAAG,SAAA,EAAW,SAAA,EAAW,YAAY,aAAA,EACxC,QAAA,EAAA;AAAA,IAAA,YAAA;AAAA,mCACA,KAAA,EAAA,EACC,QAAA,kBAAAN,cAAA;AAAA,MAACO,mBAAA;AAAA,MAAA;AAAA,QACC,OAAO,UAAA,GAAa,UAAA;AAAA,QACpB,QAAQ,WAAA,CAAY,eAAA;AAAA,QACpB,SAAA;AAAA,QACA,MAAA;AAAA,QACA,OAAO,WAAA,CAAY;AAAA;AAAA,KACrB,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,SAAS,aAAa,KAAA,EAA4C;AAChE,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO;AAAA,MACL,CAAA,EAAG;AAAA,QACD,IAAA,EAAM,MAAA;AAAA,QACN,MAAMC,cAAA,CAAU,MAAA;AAAA,QAChB,MAAA,EAAQ,KAAA;AAAA,QACR,QAAQ;AAAC;AACX,KACF;AAAA,EACF;AAEA,EAAA,IAAIC,gBAAA,CAAY,KAAK,CAAA,EAAG;AACtB,IAAA,MAAM,SAAA,GAAY,MAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAASD,cAAA,CAAU,IAAI,CAAA;AACpE,IAAA,MAAM,WAAA,GAAc,MAAM,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAASA,cAAA,CAAU,MAAM,CAAA;AAExE,IAAA,IAAI,aAAa,WAAA,EAAa;AAC5B,MAAA,OAAO,EAAE,CAAA,EAAG,SAAA,EAAW,CAAA,EAAG,WAAA,EAAY;AAAA,IACxC;AAAA,EACF;AAEA,EAAA;AACF;AAEA,SAAS,6BAA6B,KAAA,EAAyC;AAC7E,EAAA,IAAI,OAAA,GAAUE,qBAAe,KAAK,CAAA;AAClC,EAAA,IAAI,OAAA,CAAQ,IAAA,KAASjB,2BAAA,CAAqB,IAAA,EAAM;AAC9C,IAAA,OAAA,GAAU,EAAE,GAAG,OAAA,EAAS,IAAA,EAAMA,4BAAqB,SAAA,EAAU;AAAA,EAC/D;AACA,EAAA,IAAI,OAAA,CAAQ,IAAA,KAASA,2BAAA,CAAqB,SAAA,EAAW;AACnD,IAAA,OAAO,OAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAI,MAAM,CAAA,sBAAA,EAAyBA,2BAAA,CAAqB,SAAS,CAAA,SAAA,EAAY,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AACnG;;;;;"}