{"version":3,"file":"fieldOverrides.cjs","sources":["../../../src/field/fieldOverrides.ts"],"sourcesContent":["import { isNumber, set, unset, get, cloneDeep, defaultsDeep } from 'lodash';\nimport { createContext, useContext, useMemo, useRef } from 'react';\nimport { usePrevious } from 'react-use';\n\nimport { ThresholdsMode, VariableFormatID } from '@grafana/schema';\n\nimport { compareArrayValues, compareDataFrameStructures } from '../dataframe/frameComparisons';\nimport { createDataFrame, guessFieldTypeForField } from '../dataframe/processDataFrame';\nimport { PanelPlugin } from '../panel/PanelPlugin';\nimport { asHexString } from '../themes/colorManipulator';\nimport { GrafanaTheme2 } from '../themes/types';\nimport { ReducerID, reduceField } from '../transformations/fieldReducer';\nimport { fieldMatchers } from '../transformations/matchers';\nimport { ScopedVars, DataContextScopedVar } from '../types/ScopedVars';\nimport { DataFrame, NumericRange, FieldType, Field, ValueLinkConfig, FieldConfig } from '../types/dataFrame';\nimport { LinkModel, DataLink } from '../types/dataLink';\nimport { DisplayProcessor, DisplayValue, DecimalCount } from '../types/displayValue';\nimport { FieldColorModeId } from '../types/fieldColor';\nimport {\n  DynamicConfigValue,\n  ApplyFieldOverrideOptions,\n  FieldOverrideContext,\n  FieldConfigPropertyItem,\n  DataLinkPostProcessor,\n  FieldConfigSource,\n} from '../types/fieldOverrides';\nimport { InterpolateFunction, PanelData } from '../types/panel';\nimport { TimeZone } from '../types/time';\nimport { FieldMatcher } from '../types/transformations';\nimport { mapInternalLinkToExplore } from '../utils/dataLinks';\nimport { locationUtil } from '../utils/location';\n\nimport { FieldConfigOptionsRegistry } from './FieldConfigOptionsRegistry';\nimport { getDisplayProcessor, getRawDisplayProcessor } from './displayProcessor';\nimport { getMinMaxAndDelta } from './scale';\nimport { standardFieldConfigEditorRegistry } from './standardFieldConfigEditorRegistry';\n\ninterface OverrideProps {\n  match: FieldMatcher;\n  properties: DynamicConfigValue[];\n}\n\nexport function findNumericFieldMinMax(data: DataFrame[]): NumericRange {\n  let min: number | null = null;\n  let max: number | null = null;\n\n  const reducers = [ReducerID.min, ReducerID.max];\n\n  for (const frame of data) {\n    for (const field of frame.fields) {\n      if (field.type === FieldType.number) {\n        const stats = reduceField({ field, reducers });\n        const statsMin = stats[ReducerID.min];\n        const statsMax = stats[ReducerID.max];\n\n        if (min === null || statsMin < min) {\n          min = statsMin;\n        }\n\n        if (max === null || statsMax > max) {\n          max = statsMax;\n        }\n      }\n    }\n  }\n\n  return { min, max, delta: (max ?? 0) - (min ?? 0) };\n}\n\n/**\n * Return a copy of the DataFrame with all rules applied\n */\nexport function applyFieldOverrides(options: ApplyFieldOverrideOptions): DataFrame[] {\n  if (!options.data) {\n    return [];\n  }\n\n  const source = options.fieldConfig;\n  if (!source) {\n    return options.data;\n  }\n\n  const fieldConfigRegistry = options.fieldConfigRegistry ?? standardFieldConfigEditorRegistry;\n\n  let seriesIndex = 0;\n  let globalRange: NumericRange | undefined = undefined;\n\n  // Prepare the Matchers\n  const override: OverrideProps[] = [];\n  if (source.overrides) {\n    for (const rule of source.overrides) {\n      const info = fieldMatchers.get(rule.matcher.id);\n      if (info) {\n        override.push({\n          match: info.get(rule.matcher.options),\n          properties: rule.properties,\n        });\n      }\n    }\n  }\n\n  return options.data.map((originalFrame, index) => {\n    // Need to define this new frame here as it's passed to the getLinkSupplier function inside the fields loop\n    const newFrame: DataFrame = { ...originalFrame };\n    // Copy fields\n    newFrame.fields = newFrame.fields.map((field) => {\n      return {\n        ...field,\n        config: cloneDeep(field.config),\n        state: {\n          ...field.state,\n        },\n      };\n    });\n\n    for (const field of newFrame.fields) {\n      const config = field.config;\n\n      field.state!.scopedVars = {\n        __dataContext: {\n          value: {\n            data: options.data!,\n            frame: newFrame,\n            frameIndex: index,\n            field: field,\n          },\n        },\n      };\n\n      const context = {\n        field: field,\n        data: options.data!,\n        dataFrameIndex: index,\n        replaceVariables: options.replaceVariables,\n        fieldConfigRegistry: fieldConfigRegistry,\n      };\n\n      // Anything in the field config that's not set by the datasource\n      // will be filled in by panel's field configuration\n      setFieldConfigDefaults(config, source.defaults, context);\n\n      // Find any matching rules and then override\n      for (const rule of override) {\n        if (rule.match(field, newFrame, options.data!)) {\n          for (const prop of rule.properties) {\n            // config.scopedVars is set already here\n            setDynamicConfigValue(config, prop, context);\n          }\n        }\n      }\n\n      // Try harder to set a real value that is not 'other'\n      let type = field.type;\n      if (!type || type === FieldType.other) {\n        const t = guessFieldTypeForField(field);\n        if (t) {\n          type = t;\n        }\n      }\n\n      // Set the Min/Max value automatically\n      const { range, newGlobalRange } = calculateRange(config, field, globalRange, options.data!);\n      globalRange = newGlobalRange;\n\n      // Clear any cached displayName as it can change during field overrides process\n      field.state!.displayName = null;\n      field.state!.seriesIndex = seriesIndex;\n      field.state!.range = range;\n      field.type = type;\n\n      // Some color modes needs series index to assign field color so we count\n      // up series index here but ignore time fields\n      if (field.type !== FieldType.time) {\n        seriesIndex++;\n      }\n\n      // and set the display processor using it\n      field.display = getDisplayProcessor({\n        field: field,\n        theme: options.theme,\n        timeZone: options.timeZone,\n      });\n\n      // Wrap the display with a cache to avoid double calls\n      if (field.config.unit !== 'dateTimeFromNow') {\n        field.display = cachingDisplayProcessor(field.display, 2500);\n      }\n\n      // Attach data links supplier\n      field.getLinks = getLinksSupplier(\n        newFrame,\n        field,\n        field.state!.scopedVars,\n        context.replaceVariables,\n        options.timeZone,\n        options.dataLinkPostProcessor\n      );\n\n      if (field.type === FieldType.nestedFrames) {\n        for (const nestedFrames of field.values) {\n          for (let nfIndex = 0; nfIndex < nestedFrames.length; nfIndex++) {\n            // TODO: should we apply fieldOverrides to nested frames?\n\n            for (const valueField of nestedFrames[nfIndex].fields) {\n              // Get display processor for nested fields\n              valueField.display = getDisplayProcessor({\n                field: valueField,\n                theme: options.theme,\n                timeZone: options.timeZone,\n              });\n\n              valueField.state = {\n                scopedVars: {\n                  __dataContext: {\n                    value: {\n                      data: nestedFrames,\n                      frame: nestedFrames[nfIndex],\n                      frameIndex: nfIndex,\n                      field: valueField,\n                    },\n                  },\n                },\n              };\n\n              valueField.getLinks = getLinksSupplier(\n                nestedFrames[nfIndex],\n                valueField,\n                valueField.state!.scopedVars,\n                context.replaceVariables,\n                options.timeZone,\n                options.dataLinkPostProcessor\n              );\n            }\n          }\n        }\n      }\n\n      if (field.type === FieldType.frame) {\n        field.values = applyFieldOverrides({\n          ...options,\n          // nested frames can be `undefined` in certain situations, like after `merge` transform due to padding the value array.\n          // let's replace them with empty frames to avoid errors applying overrides\n          data: field.values.map((nestedFrame: DataFrame | undefined): DataFrame => {\n            const result = nestedFrame ?? createDataFrame({ fields: [] });\n            result.fields = result.fields.map((newField) => {\n              newField.config = defaultsDeep(newField.config || {}, config);\n              return newField;\n            });\n            return result;\n          }),\n        });\n      }\n    }\n\n    return newFrame;\n  });\n}\n\nfunction calculateRange(\n  config: FieldConfig,\n  field: Field,\n  globalRange: NumericRange | undefined,\n  data: DataFrame[]\n): { range?: NumericRange; newGlobalRange?: NumericRange } {\n  // If range is defined with min/max, use it\n  if (isNumber(config.min) && isNumber(config.max)) {\n    const range = { min: config.min, max: config.max, delta: config.max - config.min };\n    return { range, newGlobalRange: globalRange ?? range };\n  }\n\n  // Only calculate ranges when the field is a number and one of min/max is set to auto.\n  if (field.type !== FieldType.number || (isNumber(config.min) && isNumber(config.max))) {\n    return { newGlobalRange: globalRange };\n  }\n\n  // Calculate the min/max from the field.\n  if (config.fieldMinMax) {\n    const localRange = getMinMaxAndDelta(field);\n    const min = config.min ?? localRange.min;\n    const max = config.max ?? localRange.max;\n    return { range: { min, max, delta: max! - min! }, newGlobalRange: globalRange };\n  }\n\n  // We use the global range if supplied, otherwise we calculate it.\n  const newGlobalRange = globalRange ?? findNumericFieldMinMax(data);\n  const min = config.min ?? newGlobalRange!.min;\n  const max = config.max ?? newGlobalRange!.max;\n  return { range: { min, max, delta: max! - min! }, newGlobalRange };\n}\n\n// this is a significant optimization for streaming, where we currently re-process all values in the buffer on ech update\n// via field.display(value). this can potentially be removed once we...\n// 1. process data packets incrementally and/if cache the results in the streaming datafame (maybe by buffer index)\n// 2. have the ability to selectively get display color or text (but not always both, which are each quite expensive)\n// 3. sufficently optimize text formatting and threshold color determinitation\nfunction cachingDisplayProcessor(disp: DisplayProcessor, maxCacheSize = 2500): DisplayProcessor {\n  type dispCache = Map<unknown, DisplayValue>;\n  // decimals -> cache mapping, -1 is unspecified decimals\n  const caches = new Map<number, dispCache>();\n\n  // pre-init caches for up to 15 decimals\n  for (let i = -1; i <= 15; i++) {\n    caches.set(i, new Map());\n  }\n\n  return (value: unknown, decimals?: DecimalCount) => {\n    let cache = caches.get(decimals ?? -1)!;\n\n    let v = cache.get(value);\n\n    if (!v) {\n      // Don't grow too big\n      if (cache.size === maxCacheSize) {\n        cache.clear();\n      }\n\n      v = disp(value, decimals);\n\n      // convert to hex6 or hex8 so downstream we can cheaply test for alpha (and set new alpha)\n      // via a simple length check (in colorManipulator) rather using slow parsing via tinycolor\n      if (v.color) {\n        v.color = asHexString(v.color);\n      }\n\n      cache.set(value, v);\n    }\n\n    return v;\n  };\n}\n\nexport interface FieldOverrideEnv extends FieldOverrideContext {\n  fieldConfigRegistry: FieldConfigOptionsRegistry;\n}\n\nexport function setDynamicConfigValue(config: FieldConfig, value: DynamicConfigValue, context: FieldOverrideEnv) {\n  const reg = context.fieldConfigRegistry;\n  const item = reg.getIfExists(value.id);\n\n  if (!item) {\n    return;\n  }\n\n  let val = item.process(value.value, context, item.settings);\n\n  const remove = val === undefined || val === null;\n\n  if (remove) {\n    if (item.isCustom && config.custom) {\n      unset(config.custom, item.path);\n    } else {\n      unset(config, item.path);\n    }\n  } else {\n    // Merge arrays (e.g. mappings) when multiple overrides target the same field\n    // Override values come first so they take precedence (first match wins in getValueMappingResult)\n    if (Array.isArray(val)) {\n      const existingValue = item.isCustom ? get(config.custom, item.path) : get(config, item.path);\n\n      if (Array.isArray(existingValue)) {\n        val = [...val, ...existingValue];\n      }\n    }\n\n    if (item.isCustom) {\n      if (!config.custom) {\n        config.custom = {};\n      }\n      set(config.custom, item.path, val);\n    } else {\n      set(config, item.path, val);\n    }\n  }\n}\n\n// config -> from DS\n// defaults -> from Panel config\nexport function setFieldConfigDefaults(config: FieldConfig, defaults: FieldConfig, context: FieldOverrideEnv) {\n  // For cases where we have links on the datasource config and the panel config, we need to merge them\n  if (config.links && defaults.links) {\n    // Combine the data source links and the panel default config links\n    config.links = [...config.links, ...defaults.links];\n  }\n\n  // if we have a base threshold set by default but not on the config, we need to merge it in\n  const defaultBaseStep =\n    defaults?.thresholds?.mode === ThresholdsMode.Absolute &&\n    defaults.thresholds?.steps.find((step) => step.value === -Infinity);\n  if (\n    config.thresholds?.mode === ThresholdsMode.Absolute &&\n    !config.thresholds.steps.some((step) => step.value === -Infinity) &&\n    defaultBaseStep\n  ) {\n    config.thresholds.steps = [defaultBaseStep, ...config.thresholds.steps];\n  }\n  for (const fieldConfigProperty of context.fieldConfigRegistry.list()) {\n    if (fieldConfigProperty.isCustom && !config.custom) {\n      config.custom = {};\n    }\n    processFieldConfigValue(\n      fieldConfigProperty.isCustom ? config.custom : config,\n      fieldConfigProperty.isCustom ? defaults.custom : defaults,\n      fieldConfigProperty,\n      context\n    );\n  }\n\n  validateFieldConfig(config);\n}\n\nfunction processFieldConfigValue(\n  destination: Record<string, unknown>, // it's mutable\n  source: Record<string, unknown>,\n  fieldConfigProperty: FieldConfigPropertyItem,\n  context: FieldOverrideEnv\n) {\n  const currentConfig = get(destination, fieldConfigProperty.path);\n  if (currentConfig === null || currentConfig === undefined) {\n    const item = context.fieldConfigRegistry.getIfExists(fieldConfigProperty.id);\n    if (!item) {\n      return;\n    }\n\n    if (item && item.shouldApply(context.field!)) {\n      const val = item.process(get(source, item.path), context, item.settings);\n      if (val !== undefined && val !== null) {\n        set(destination, item.path, val);\n      }\n    }\n  }\n}\n\n/**\n * This checks that all options on FieldConfig make sense.  It mutates any value that needs\n * fixed.  In particular this makes sure that the first threshold value is -Infinity (not valid in JSON)\n */\nexport function validateFieldConfig(config: FieldConfig) {\n  const { thresholds } = config;\n\n  if (!config.color) {\n    if (thresholds) {\n      config.color = {\n        mode: FieldColorModeId.Thresholds,\n      };\n    }\n    // No Color settings\n  } else if (!config.color.mode) {\n    // Without a mode, skip color altogether\n    delete config.color;\n  }\n\n  // Verify that max > min (swap if necessary)\n  if (config.hasOwnProperty('min') && config.hasOwnProperty('max') && config.min! > config.max!) {\n    const tmp = config.max;\n    config.max = config.min;\n    config.min = tmp;\n  }\n}\n\nconst defaultInternalLinkPostProcessor: DataLinkPostProcessor = (options) => {\n  // For internal links at the moment only destination is Explore.\n  const { link, linkModel, dataLinkScopedVars, field, replaceVariables } = options;\n\n  if (link.internal) {\n    return mapInternalLinkToExplore({\n      link,\n      internalLink: link.internal,\n      scopedVars: dataLinkScopedVars,\n      field,\n      range: link.internal.range,\n      replaceVariables,\n    });\n  } else {\n    return linkModel;\n  }\n};\n\nexport const getLinksSupplier =\n  (\n    frame: DataFrame,\n    field: Field,\n    fieldScopedVars: ScopedVars,\n    replaceVariables: InterpolateFunction,\n    timeZone?: TimeZone,\n    dataLinkPostProcessor?: DataLinkPostProcessor\n  ) =>\n  (config: ValueLinkConfig): Array<LinkModel<Field>> => {\n    if (!field.config.links || field.config.links.length === 0) {\n      return [];\n    }\n\n    const linkModels = field.config.links.map((link: DataLink) => {\n      const dataContext: DataContextScopedVar = getFieldDataContextClone(frame, field, fieldScopedVars);\n      const dataLinkScopedVars = {\n        ...fieldScopedVars,\n        __dataContext: dataContext,\n      };\n\n      const boundReplaceVariables: InterpolateFunction = (value, scopedVars, format) =>\n        replaceVariables(value, { ...dataLinkScopedVars, ...scopedVars }, format);\n\n      // We are not displaying reduction result\n      if (config.valueRowIndex !== undefined && !isNaN(config.valueRowIndex)) {\n        dataContext.value.rowIndex = config.valueRowIndex;\n      } else {\n        dataContext.value.calculatedValue = config.calculatedValue;\n      }\n\n      let linkModel: LinkModel<Field>;\n\n      let href =\n        link.onClick || !link.onBuildUrl\n          ? link.url\n          : link.onBuildUrl({\n              origin: field,\n              replaceVariables: boundReplaceVariables,\n            });\n\n      if (href) {\n        href = locationUtil.assureBaseUrl(href.replace(/\\n/g, ''));\n        href = replaceVariables(href, dataLinkScopedVars, VariableFormatID.UriEncode);\n\n        if (href?.length > 0) {\n          href = locationUtil.processUrl(href);\n        }\n      }\n\n      if (link.onClick) {\n        linkModel = {\n          href,\n          title: replaceVariables(link.title || '', dataLinkScopedVars),\n          target: link.targetBlank ? '_blank' : undefined,\n          onClick: (evt: MouseEvent, origin: Field) => {\n            link.onClick!({\n              origin: origin ?? field,\n              e: evt,\n              replaceVariables: boundReplaceVariables,\n            });\n          },\n          origin: field,\n          oneClick: link.oneClick ?? false,\n        };\n      } else {\n        linkModel = {\n          href,\n          title: replaceVariables(link.title || '', dataLinkScopedVars),\n          target: link.targetBlank ? '_blank' : undefined,\n          origin: field,\n          oneClick: link.oneClick ?? false,\n        };\n      }\n\n      return (dataLinkPostProcessor || defaultInternalLinkPostProcessor)({\n        frame,\n        field,\n        dataLinkScopedVars,\n        replaceVariables,\n        config,\n        link,\n        linkModel,\n      });\n    });\n\n    return linkModels.filter((link): link is LinkModel => !!link);\n  };\n\n/**\n * Return a copy of the DataFrame with raw data\n */\nexport function applyRawFieldOverrides(data: DataFrame[]): DataFrame[] {\n  if (!data || data.length === 0) {\n    return [];\n  }\n\n  const newData = [...data];\n  const processor = getRawDisplayProcessor();\n\n  for (let frameIndex = 0; frameIndex < newData.length; frameIndex++) {\n    const newFrame = { ...newData[frameIndex] };\n    const newFields = [...newFrame.fields];\n\n    for (let fieldIndex = 0; fieldIndex < newFields.length; fieldIndex++) {\n      newFields[fieldIndex] = {\n        ...newFields[fieldIndex],\n        display: processor,\n      };\n    }\n\n    newData[frameIndex] = {\n      ...newFrame,\n      fields: newFields,\n    };\n  }\n\n  return newData;\n}\n\n/**\n * @internal\n */\nexport function useFieldOverrides(\n  plugin: PanelPlugin | undefined,\n  fieldConfig: FieldConfigSource | undefined,\n  data: PanelData | undefined,\n  timeZone: string,\n  theme: GrafanaTheme2,\n  replace: InterpolateFunction\n): PanelData | undefined {\n  const fieldConfigRegistry = plugin?.fieldConfigRegistry;\n  const structureRev = useRef(0);\n  const prevSeries = usePrevious(data?.series);\n\n  const { dataLinkPostProcessor } = useDataLinksContext();\n\n  return useMemo(() => {\n    if (!fieldConfigRegistry || !fieldConfig || !data) {\n      return;\n    }\n\n    const series = data?.series;\n\n    if (\n      data.structureRev == null &&\n      series &&\n      prevSeries &&\n      !compareArrayValues(series, prevSeries, compareDataFrameStructures)\n    ) {\n      structureRev.current++;\n    }\n\n    const panelData: PanelData = {\n      structureRev: structureRev.current,\n      ...data,\n      series: applyFieldOverrides({\n        data: series,\n        fieldConfig,\n        fieldConfigRegistry,\n        replaceVariables: replace,\n        theme,\n        timeZone,\n        dataLinkPostProcessor,\n      }),\n    };\n    if (data.annotations && data.annotations.length > 0) {\n      panelData.annotations = applyFieldOverrides({\n        data: data.annotations,\n        fieldConfig: {\n          defaults: {},\n          overrides: [],\n        },\n        replaceVariables: replace,\n        theme,\n        timeZone,\n        dataLinkPostProcessor,\n      });\n    }\n    return panelData;\n  }, [fieldConfigRegistry, fieldConfig, data, prevSeries, timeZone, theme, replace, dataLinkPostProcessor]);\n}\n\n/**\n * Clones the existing dataContext or creates a new one\n */\nexport function getFieldDataContextClone(frame: DataFrame, field: Field, fieldScopedVars: ScopedVars) {\n  if (fieldScopedVars?.__dataContext) {\n    return {\n      value: {\n        ...fieldScopedVars.__dataContext.value,\n      },\n    };\n  }\n\n  return { value: { frame, field, data: [frame] } };\n}\n\n/**\n * @internal\n */\nexport const DataLinksContext = createContext<{\n  dataLinkPostProcessor: DataLinkPostProcessor;\n}>({ dataLinkPostProcessor: defaultInternalLinkPostProcessor });\n\n/**\n * @internal\n */\nexport const useDataLinksContext = () => useContext(DataLinksContext);\n"],"names":["ReducerID","FieldType","reduceField","standardFieldConfigEditorRegistry","fieldMatchers","cloneDeep","guessFieldTypeForField","getDisplayProcessor","createDataFrame","defaultsDeep","isNumber","getMinMaxAndDelta","min","max","asHexString","unset","get","set","ThresholdsMode","FieldColorModeId","mapInternalLinkToExplore","locationUtil","VariableFormatID","getRawDisplayProcessor","useRef","usePrevious","useMemo","compareArrayValues","compareDataFrameStructures","createContext","useContext"],"mappings":"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"}