{"version":3,"file":"scale.mjs","sources":["../../../src/field/scale.ts"],"sourcesContent":["import { isNumber } from 'lodash';\n\nimport { GrafanaTheme2 } from '../themes/types';\nimport { reduceField, ReducerID } from '../transformations/fieldReducer';\nimport { Field, FieldConfig, FieldType, NumericRange } from '../types/dataFrame';\nimport { Threshold } from '../types/thresholds';\n\nimport { getFieldColorModeForField } from './fieldColor';\nimport { getActiveThresholdForValue } from './thresholds';\n\nexport interface ColorScaleValue {\n  percent: number; // 0-1\n  threshold: Threshold | undefined;\n  color: string;\n}\n\nexport type ScaleCalculator = (value: number) => ColorScaleValue;\n\nexport function getScaleCalculator(field: Field, theme: GrafanaTheme2): ScaleCalculator {\n  if (field.type === FieldType.boolean) {\n    return getBooleanScaleCalculator(field, theme);\n  }\n\n  const mode = getFieldColorModeForField(field);\n  const getColor = mode.getCalculator(field, theme);\n  const info = field.state?.range ?? getMinMaxAndDelta(field);\n\n  return (value: number) => {\n    let percent = 0;\n\n    if (value !== -Infinity) {\n      percent = (value - info.min!) / info.delta;\n\n      if (Number.isNaN(percent)) {\n        percent = 0;\n      }\n    }\n\n    const threshold = getActiveThresholdForValue(field, value, percent);\n\n    return {\n      percent,\n      threshold,\n      color: getColor(value, percent, threshold),\n    };\n  };\n}\n\nfunction getBooleanScaleCalculator(field: Field, theme: GrafanaTheme2): ScaleCalculator {\n  const trueValue: ColorScaleValue = {\n    color: theme.visualization.getColorByName('green'),\n    percent: 1,\n    threshold: undefined,\n  };\n\n  const falseValue: ColorScaleValue = {\n    color: theme.visualization.getColorByName('red'),\n    percent: 0,\n    threshold: undefined,\n  };\n\n  const mode = getFieldColorModeForField(field);\n  if (mode.isContinuous && mode.getColors) {\n    const colors = mode.getColors(theme);\n    trueValue.color = colors[colors.length - 1];\n    falseValue.color = colors[0];\n  }\n\n  return (value: number) => {\n    return Boolean(value) ? trueValue : falseValue;\n  };\n}\n\nexport function getMinMaxAndDelta(field: Field): NumericRange {\n  if (field.type !== FieldType.number) {\n    return { min: 0, max: 100, delta: 100 };\n  }\n\n  // Calculate min/max if required\n  let min = field.config.min;\n  let max = field.config.max;\n\n  if (!isNumber(min) || !isNumber(max)) {\n    if (field.values && field.values.length) {\n      const stats = reduceField({ field, reducers: [ReducerID.min, ReducerID.max] });\n      if (!isNumber(min)) {\n        min = stats[ReducerID.min];\n      }\n      if (!isNumber(max)) {\n        max = stats[ReducerID.max];\n      }\n    } else {\n      min = 0;\n      max = 100;\n    }\n  }\n\n  return {\n    min,\n    max,\n    delta: max! - min!,\n  };\n}\n\n/**\n * @internal\n */\nexport function getFieldConfigWithMinMax(field: Field, local?: boolean): FieldConfig {\n  const { config } = field;\n  let { min, max } = config;\n\n  if (isNumber(min) && isNumber(max)) {\n    return config;\n  }\n\n  if (local || !field.state?.range) {\n    return { ...config, ...getMinMaxAndDelta(field) };\n  }\n\n  return { ...config, ...field.state.range };\n}\n"],"names":[],"mappings":"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"}