{"version":3,"file":"fieldDisplay.cjs","sources":["../../../src/field/fieldDisplay.ts"],"sourcesContent":["import { isEmpty } from 'lodash';\n\nimport { DataFrameView } from '../dataframe/DataFrameView';\nimport { getTimeField } from '../dataframe/processDataFrame';\nimport { GrafanaTheme2 } from '../themes/types';\nimport { isReducerID, reduceField, ReducerID } from '../transformations/fieldReducer';\nimport { getFieldMatcher } from '../transformations/matchers';\nimport { FieldMatcherID } from '../transformations/matchers/ids';\nimport { ScopedVars } from '../types/ScopedVars';\nimport { DataFrame, Field, FieldConfig, FieldType } from '../types/dataFrame';\nimport { LinkModel } from '../types/dataLink';\nimport { DisplayValue, DisplayValueAlignmentFactors } from '../types/displayValue';\nimport { FieldConfigSource } from '../types/fieldOverrides';\nimport { InterpolateFunction } from '../types/panel';\nimport { TimeRange, TimeZone } from '../types/time';\n\nimport { getDisplayProcessor } from './displayProcessor';\nimport { getFieldDisplayName } from './fieldState';\n\n/**\n * Options for how to turn DataFrames into an array of display values\n */\nexport interface ReduceDataOptions {\n  /* If true show each row value */\n  values?: boolean;\n  /** if showing all values limit */\n  limit?: number;\n  /** When !values, pick one value for the whole field */\n  calcs: string[];\n  /** Which fields to show.  By default this is only numeric fields */\n  fields?: string;\n}\n\n// TODO: use built in variables, same as for data links?\nexport const VAR_SERIES_NAME = '__series.name';\nexport const VAR_FIELD_NAME = '__field.displayName'; // Includes the rendered tags and naming strategy\nexport const VAR_FIELD_LABELS = '__field.labels';\nexport const VAR_CALC = '__calc';\nexport const VAR_CELL_PREFIX = '__cell_'; // consistent with existing table templates\n\nexport interface FieldSparkline {\n  y: Field; // Y values\n  x?: Field; // if this does not exist, use the index\n  timeRange?: TimeRange; // Optionally force an absolute time\n  highlightIndex?: number;\n  highlightLine?: number;\n}\n\nexport interface FieldDisplay {\n  name: string; // The field name (title is in display)\n  field: FieldConfig;\n  display: DisplayValue;\n  sparkline?: FieldSparkline;\n\n  // Expose to the original values for delayed inspection (DataLinks etc)\n  view?: DataFrameView;\n  colIndex?: number; // The field column index\n  rowIndex?: number; // only filled in when the value is from a row (ie, not a reduction)\n  getLinks?: () => LinkModel[];\n  hasLinks: boolean;\n}\n\nexport interface GetFieldDisplayValuesOptions {\n  data?: DataFrame[];\n  reduceOptions: ReduceDataOptions;\n  fieldConfig: FieldConfigSource;\n  replaceVariables: InterpolateFunction;\n  sparkline?: boolean; // Calculate the sparkline\n  percentChange?: boolean; // Calculate percent change\n  theme: GrafanaTheme2;\n  timeZone?: TimeZone;\n}\n\nexport const DEFAULT_FIELD_DISPLAY_VALUES_LIMIT = 25;\n\ninterface SparklineHighlightPoint {\n  type: 'point';\n  xIdx: number;\n}\n\ninterface SparklineHighlightLine {\n  type: 'line';\n  y: number;\n}\n\nexport function getSparklineHighlight(\n  sparkline: FieldSparkline,\n  calc: ReducerID\n): SparklineHighlightPoint | SparklineHighlightLine | void {\n  switch (calc) {\n    case ReducerID.last:\n      return { type: 'point', xIdx: sparkline.y.values.length - 1 };\n    case ReducerID.first:\n      return { type: 'point', xIdx: 0 };\n    case ReducerID.lastNotNull: {\n      for (let k = sparkline.y.values.length - 1; k >= 0; k--) {\n        const v = sparkline.y.values[k];\n        if (v !== null && v !== undefined && !Number.isNaN(v)) {\n          return { type: 'point', xIdx: k };\n        }\n      }\n      return;\n    }\n    case ReducerID.firstNotNull: {\n      for (let k = 0; k < sparkline.y.values.length; k++) {\n        const v = sparkline.y.values[k];\n        if (v !== null && v !== undefined && !Number.isNaN(v)) {\n          return { type: 'point', xIdx: k };\n        }\n      }\n      return;\n    }\n    case ReducerID.min: {\n      let minIdx = -1;\n      let prevMin = Infinity;\n      for (let k = 0; k < sparkline.y.values.length; k++) {\n        const v = sparkline.y.values[k];\n        if (v !== null && v !== undefined && !Number.isNaN(v) && v < prevMin) {\n          prevMin = v;\n          minIdx = k;\n        }\n      }\n      return minIdx >= 0 ? { type: 'point', xIdx: minIdx } : undefined;\n    }\n    case ReducerID.max: {\n      let maxIdx = -1;\n      let prevMax = -Infinity;\n      for (let k = 0; k < sparkline.y.values.length; k++) {\n        const v = sparkline.y.values[k];\n        if (v !== null && v !== undefined && !Number.isNaN(v) && v > prevMax) {\n          prevMax = v;\n          maxIdx = k;\n        }\n      }\n      return maxIdx >= 0 ? { type: 'point', xIdx: maxIdx } : undefined;\n    }\n    case ReducerID.mean:\n      return { type: 'line', y: reduceField({ field: sparkline.y, reducers: [ReducerID.mean] }).mean };\n    case ReducerID.median:\n      return { type: 'line', y: reduceField({ field: sparkline.y, reducers: [ReducerID.median] }).median };\n    default:\n      return;\n  }\n}\n\nexport const getFieldDisplayValues = (options: GetFieldDisplayValuesOptions): FieldDisplay[] => {\n  const { replaceVariables, reduceOptions, timeZone, theme } = options;\n  const calcs = reduceOptions.calcs.length ? reduceOptions.calcs : [ReducerID.last];\n\n  const values: FieldDisplay[] = [];\n  const fieldMatcher = getFieldMatcher(\n    reduceOptions.fields\n      ? {\n          id: FieldMatcherID.byRegexp,\n          options: reduceOptions.fields,\n        }\n      : {\n          id: FieldMatcherID.numeric,\n        }\n  );\n\n  const data = options.data ?? [];\n  const limit = reduceOptions.limit ? reduceOptions.limit : DEFAULT_FIELD_DISPLAY_VALUES_LIMIT;\n\n  let hitLimit = false;\n\n  for (let s = 0; s < data.length && !hitLimit; s++) {\n    const dataFrame = data[s]; // Name is already set\n\n    const { timeField } = getTimeField(dataFrame);\n    const view = new DataFrameView(dataFrame);\n\n    for (let i = 0; i < dataFrame.fields.length && !hitLimit; i++) {\n      const field = dataFrame.fields[i];\n      const fieldLinksSupplier = field.getLinks;\n\n      // To filter out time field, need an option for this\n      if (!fieldMatcher(field, dataFrame, data)) {\n        continue;\n      }\n\n      let config = field.config; // already set by the prepare task\n\n      if (field.state?.range) {\n        // Us the global min/max values\n        config = {\n          ...config,\n          ...field.state?.range,\n        };\n      }\n\n      let displayName = field.config.displayName ?? '';\n\n      const display =\n        field.display ??\n        getDisplayProcessor({\n          field,\n          theme: options.theme,\n          timeZone,\n        });\n\n      // Show all rows\n      if (reduceOptions.values) {\n        for (let j = 0; j < field.values.length; j++) {\n          field.state = setIndexForPaletteColor(field, values.length);\n\n          const scopedVars = getFieldScopedVarsWithDataContexAndRowIndex(field, j);\n          const displayValue = display(field.values[j]);\n          const rowName = getSmartDisplayNameForRow(dataFrame, field, j, replaceVariables, scopedVars);\n          const overrideColor = lookupRowColorFromOverride(rowName, options.fieldConfig, theme);\n\n          values.push({\n            name: '',\n            field: config,\n            display: {\n              ...displayValue,\n              title: rowName,\n              color: overrideColor ?? displayValue.color,\n            },\n            view,\n            colIndex: i,\n            rowIndex: j,\n            getLinks: fieldLinksSupplier\n              ? () =>\n                  fieldLinksSupplier({\n                    valueRowIndex: j,\n                  })\n              : () => [],\n            hasLinks: hasLinks(field),\n          });\n\n          if (values.length >= limit) {\n            hitLimit = true;\n            break;\n          }\n        }\n      } else {\n        const results = reduceField({\n          field,\n          reducers: calcs, // The stats to calculate\n        });\n\n        for (const calc of calcs) {\n          const scopedVars = field.state?.scopedVars ?? {};\n          scopedVars[VAR_CALC] = { value: calc, text: calc };\n\n          const displayValue = display(results[calc]);\n\n          if (displayName !== '') {\n            displayValue.title = replaceVariables(displayName, scopedVars);\n          } else {\n            displayValue.title = getFieldDisplayName(field, dataFrame, data);\n          }\n          displayValue.percentChange = options.percentChange\n            ? reduceField({ field: field, reducers: [ReducerID.diffperc] }).diffperc\n            : undefined;\n\n          let sparkline: FieldSparkline | undefined = undefined;\n          if (options.sparkline) {\n            sparkline = {\n              y: dataFrame.fields[i],\n              x: timeField,\n            };\n            if (isReducerID(calc)) {\n              const sparklineHighlight = getSparklineHighlight(sparkline, calc);\n              switch (sparklineHighlight?.type) {\n                case 'point':\n                  sparkline.highlightIndex = sparklineHighlight.xIdx;\n                  break;\n                case 'line':\n                  sparkline.highlightLine = sparklineHighlight.y;\n                  break;\n              }\n            }\n          }\n\n          // If there is only one row in the data frame, then set the\n          // valueRowIndex to that one row. This allows the data macros in\n          // things like links to access other fields from the data frame.\n          //\n          // If there were more rows, it still may be sane to set the row\n          // index, but it may be confusing; the calculation may have\n          // selected a value from a different row or it may have aggregated\n          // the values from multiple rows, so to make just the first row\n          // available would be arbitrary. For now, the users will have to\n          // ensure that the data frame has just one row if they want data\n          // link referencing other fields to work.\n          //\n          // TODO: A more complete solution here would be to allow the\n          // calculation to report a relevant row and use that value. For\n          // example, a common calculation is 'lastNotNull'. It'd be nifty to\n          // know which row the display value corresponds to in that case if\n          // there were potentially many\n          const valueRowIndex = dataFrame.length === 1 ? 0 : undefined;\n\n          values.push({\n            name: calc,\n            field: config,\n            display: displayValue,\n            sparkline,\n            view,\n            colIndex: i,\n            getLinks: fieldLinksSupplier\n              ? () =>\n                  fieldLinksSupplier({\n                    calculatedValue: displayValue,\n                    valueRowIndex,\n                  })\n              : () => [],\n            hasLinks: hasLinks(field),\n          });\n        }\n      }\n    }\n  }\n\n  if (values.length === 0) {\n    values.push(createNoValuesFieldDisplay(options));\n  }\n\n  return values;\n};\n\nfunction getSmartDisplayNameForRow(\n  frame: DataFrame,\n  field: Field,\n  rowIndex: number,\n  replaceVariables: InterpolateFunction,\n  scopedVars: ScopedVars | undefined\n): string {\n  const displayName = field.config.displayName;\n\n  if (displayName) {\n    // Handle old __cell_n syntax\n    if (displayName.indexOf(VAR_CELL_PREFIX)) {\n      return replaceVariables(fixCellTemplateExpressions(displayName), scopedVars);\n    }\n\n    return replaceVariables(displayName, scopedVars);\n  }\n\n  let parts: string[] = [];\n  let otherNumericFields = 0;\n\n  for (const otherField of frame.fields) {\n    if (otherField === field) {\n      continue;\n    }\n\n    if (otherField.type === FieldType.string) {\n      const value = otherField.values[rowIndex] ?? '';\n      const mappedValue = otherField.display ? otherField.display(value).text : value;\n      if (mappedValue.length > 0) {\n        parts.push(mappedValue);\n      }\n    } else if (otherField.type === FieldType.number) {\n      otherNumericFields++;\n    }\n  }\n\n  if (otherNumericFields || parts.length === 0) {\n    parts.push(getFieldDisplayName(field, frame));\n  }\n\n  return parts.join(' ');\n}\n\n/**\n * Palette color modes use series index (field index) which does not work for when displaing rows\n * So updating seriesIndex here makes the palette color modes work in \"All values\" mode\n */\nfunction setIndexForPaletteColor(field: Field, currentLength: number) {\n  return {\n    ...field.state,\n    seriesIndex: currentLength,\n  };\n}\n\n/**\n * This function makes overrides that set color work for row values\n */\nfunction lookupRowColorFromOverride(displayName: string, fieldConfig: FieldConfigSource, theme: GrafanaTheme2) {\n  for (const override of fieldConfig.overrides) {\n    if (override.matcher.id === 'byName' && override.matcher.options === displayName) {\n      for (const prop of override.properties) {\n        if (prop.id === 'color' && prop.value) {\n          return theme.visualization.getColorByName(prop.value.fixedColor);\n        }\n      }\n    }\n  }\n\n  return null;\n}\n\nexport function hasLinks(field: Field): boolean {\n  return field.config?.links?.length ? field.config.links.length > 0 : false;\n}\n\nexport function getDisplayValueAlignmentFactors(values: FieldDisplay[]): DisplayValueAlignmentFactors {\n  let maxTitle = '';\n  let maxText = '';\n  let maxPrefix = '';\n  let maxSuffix = '';\n\n  for (let i = 0; i < values.length; i++) {\n    const v = values[i].display;\n\n    if (v.text && v.text.length > maxText.length) {\n      maxText = v.text;\n    }\n\n    if (v.title && v.title.length > maxTitle.length) {\n      maxTitle = v.title;\n    }\n\n    if (v.prefix && v.prefix.length > maxPrefix.length) {\n      maxPrefix = v.prefix;\n    }\n\n    if (v.suffix && v.suffix.length > maxSuffix.length) {\n      maxSuffix = v.suffix;\n    }\n  }\n\n  return { text: maxText, title: maxTitle, suffix: maxSuffix, prefix: maxPrefix };\n}\n\nfunction createNoValuesFieldDisplay(options: GetFieldDisplayValuesOptions): FieldDisplay {\n  const displayName = 'No data';\n  const { fieldConfig, timeZone } = options;\n  const { defaults } = fieldConfig;\n\n  const displayProcessor = getDisplayProcessor({\n    field: {\n      name: '',\n      type: FieldType.other,\n      config: defaults,\n    },\n    theme: options.theme,\n    timeZone,\n  });\n\n  const display = displayProcessor(null);\n  const text = getDisplayText(display, displayName);\n\n  return {\n    name: displayName,\n    field: {\n      ...defaults,\n      max: defaults.max ?? 0,\n      min: defaults.min ?? 0,\n    },\n    display: {\n      text,\n      numeric: 0,\n      color: display.color,\n    },\n    hasLinks: false,\n  };\n}\n\nfunction getDisplayText(display: DisplayValue, fallback: string): string {\n  if (!display || isEmpty(display.text)) {\n    return fallback;\n  }\n  return display.text;\n}\n\nexport function fixCellTemplateExpressions(str: string) {\n  return str.replace(\n    /\\${__cell_(\\d+)(.*?)}|\\[\\[__cell_(\\d+)(.*?)\\]\\]|\\$__cell_(\\d+)(\\S*)/g,\n    (match, cellNum1, fmt1, cellNum2, fmt2, cellNum3, fmt3) => {\n      return `\\${__data.fields[${cellNum1 ?? cellNum2 ?? cellNum3}]${fmt1 ?? fmt2 ?? fmt3}}`;\n    }\n  );\n}\n\n/**\n * Clones the existing dataContext and adds rowIndex to it\n */\nfunction getFieldScopedVarsWithDataContexAndRowIndex(field: Field, rowIndex: number): ScopedVars | undefined {\n  if (field.state?.scopedVars?.__dataContext) {\n    return {\n      ...field.state?.scopedVars,\n      __dataContext: {\n        value: {\n          ...field.state?.scopedVars?.__dataContext.value,\n          rowIndex,\n        },\n      },\n    };\n  }\n\n  return field.state?.scopedVars;\n}\n"],"names":["ReducerID","reduceField","getFieldMatcher","FieldMatcherID","getTimeField","DataFrameView","getDisplayProcessor","getFieldDisplayName","isReducerID","FieldType","displayProcessor","isEmpty"],"mappings":"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"}