{"version":3,"file":"SingleStatBaseOptions.mjs","sources":["../../../../src/components/SingleStatShared/SingleStatBaseOptions.ts"],"sourcesContent":["import { cloneDeep, identity, isNumber, omit, pickBy } from 'lodash';\n\nimport {\n  convertOldAngularValueMappings,\n  FieldColorModeId,\n  FieldConfig,\n  fieldReducers,\n  PanelModel,\n  ReduceDataOptions,\n  ReducerID,\n  sortThresholds,\n  Threshold,\n  ThresholdsConfig,\n  ThresholdsMode,\n  validateFieldConfig,\n  ValueMapping,\n  VizOrientation,\n} from '@grafana/data';\nimport { LegendDisplayMode, OptionsWithLegend, OptionsWithTextFormatting } from '@grafana/schema';\n\nexport interface SingleStatBaseOptions extends OptionsWithTextFormatting {\n  reduceOptions: ReduceDataOptions;\n  orientation: VizOrientation;\n}\n\nconst optionsToKeep = ['reduceOptions', 'orientation'];\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function sharedSingleStatPanelChangedHandler(\n  panel: PanelModel<Partial<SingleStatBaseOptions>> | any,\n  prevPluginId: string,\n  prevOptions: any\n) {\n  let options = panel.options;\n\n  panel.fieldConfig = panel.fieldConfig || {\n    defaults: {},\n    overrides: [],\n  };\n\n  // Migrating from angular singlestat\n  if (prevPluginId === 'singlestat' && prevOptions.angular) {\n    return migrateFromAngularSinglestat(panel, prevOptions);\n  } else if (prevPluginId === 'graph') {\n    // Migrating from Graph panel\n    return migrateFromGraphPanel(panel, prevOptions);\n  }\n\n  for (const k of optionsToKeep) {\n    if (prevOptions.hasOwnProperty(k)) {\n      options[k] = cloneDeep(prevOptions[k]);\n    }\n  }\n\n  return options;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction migrateFromGraphPanel(panel: PanelModel<Partial<SingleStatBaseOptions>> | any, prevOptions: any) {\n  const graphOptions: GraphOptions = prevOptions.angular;\n\n  const options: SingleStatBaseOptions & OptionsWithLegend = {\n    orientation: VizOrientation.Auto,\n    reduceOptions: {\n      values: false,\n      calcs: [],\n    },\n    legend: {\n      displayMode: LegendDisplayMode.List,\n      showLegend: true,\n      placement: 'bottom',\n      calcs: [],\n    },\n  };\n\n  if (graphOptions.xaxis?.mode === 'series') {\n    panel.fieldConfig = {\n      ...panel.fieldConfig,\n      defaults: {\n        ...panel.fieldConfig.defaults,\n        color: { mode: 'palette-classic' },\n      },\n    };\n\n    // Value options calculation migration\n    if (graphOptions.xaxis.values) {\n      options.reduceOptions.calcs = getReducerForMigration(graphOptions.xaxis.values);\n    }\n\n    // Legend migration\n    const legendConfig = graphOptions.legend;\n    if (legendConfig) {\n      if (legendConfig.show) {\n        options.legend.displayMode = legendConfig.alignAsTable ? LegendDisplayMode.Table : LegendDisplayMode.List;\n      } else {\n        options.legend.showLegend = false;\n      }\n\n      if (legendConfig.rightSide) {\n        options.legend.placement = 'right';\n      }\n\n      if (legendConfig.values) {\n        const enabledLegendValues = pickBy(legendConfig, identity);\n        options.legend.calcs = getReducersFromLegend(enabledLegendValues);\n      }\n\n      if (legendConfig.sideWidth) {\n        options.legend.width = legendConfig.sideWidth;\n      }\n    }\n  }\n\n  return options;\n}\n\nfunction migrateFromAngularSinglestat(panel: PanelModel<Partial<SingleStatBaseOptions>> | any, prevOptions: any) {\n  const prevPanel = prevOptions.angular;\n  const reducer = fieldReducers.getIfExists(prevPanel.valueName);\n  const options: SingleStatBaseOptions = {\n    reduceOptions: {\n      calcs: [reducer ? reducer.id : ReducerID.mean],\n    },\n    orientation: VizOrientation.Horizontal,\n  };\n\n  const defaults: FieldConfig = {};\n\n  if (prevPanel.format) {\n    defaults.unit = prevPanel.format;\n  }\n\n  if (prevPanel.tableColumn) {\n    options.reduceOptions.fields = `/^${prevPanel.tableColumn}$/`;\n  }\n\n  if (prevPanel.nullPointMode) {\n    defaults.nullValueMode = prevPanel.nullPointMode;\n  }\n\n  if (prevPanel.nullText) {\n    defaults.noValue = prevPanel.nullText;\n  }\n\n  if (prevPanel.decimals || prevPanel.decimals === 0) {\n    defaults.decimals = prevPanel.decimals;\n  }\n\n  // Convert thresholds and color values\n  if (prevPanel.thresholds && prevPanel.colors) {\n    const levels = prevPanel.thresholds.split(',').map((strVale: string) => {\n      return Number(strVale.trim());\n    });\n\n    // One more color than threshold\n    const thresholds: Threshold[] = [];\n    for (const color of prevPanel.colors) {\n      const idx = thresholds.length - 1;\n      if (idx >= 0) {\n        thresholds.push({ value: levels[idx], color });\n      } else {\n        thresholds.push({ value: -Infinity, color });\n      }\n    }\n\n    defaults.thresholds = {\n      mode: ThresholdsMode.Absolute,\n      steps: thresholds,\n    };\n  }\n\n  // Convert value mappings\n  const mappings = convertOldAngularValueMappings(prevPanel, defaults.thresholds);\n  if (mappings && mappings.length) {\n    defaults.mappings = mappings;\n  }\n\n  if (prevPanel.gauge && prevPanel.gauge.show) {\n    defaults.min = prevPanel.gauge.minValue;\n    defaults.max = prevPanel.gauge.maxValue;\n  }\n\n  panel.fieldConfig.defaults = defaults;\n\n  return options;\n}\n\nexport function sharedSingleStatMigrationHandler(panel: PanelModel<SingleStatBaseOptions>): SingleStatBaseOptions {\n  if (!panel.options) {\n    // This happens on the first load or when migrating from angular\n    return {\n      reduceOptions: {\n        calcs: [ReducerID.mean],\n      },\n      orientation: VizOrientation.Horizontal,\n    };\n  }\n\n  const previousVersion = parseFloat(panel.pluginVersion || '6.1');\n  let options = panel.options as any;\n\n  if (previousVersion < 6.2) {\n    options = migrateFromValueOptions(options);\n  }\n\n  if (previousVersion < 6.3) {\n    options = moveThresholdsAndMappingsToField(options);\n  }\n\n  const { fieldOptions } = options;\n\n  if (previousVersion < 6.6 && fieldOptions) {\n    // discard the old `override` options and enter an empty array\n    if (fieldOptions && fieldOptions.override) {\n      const { override, ...rest } = options.fieldOptions;\n      options = {\n        ...options,\n        fieldOptions: {\n          ...rest,\n          overrides: [],\n        },\n      };\n    }\n\n    // Move thresholds to steps\n    let thresholds = fieldOptions?.defaults?.thresholds;\n    if (thresholds) {\n      delete fieldOptions.defaults.thresholds;\n    } else {\n      thresholds = fieldOptions?.thresholds;\n      delete fieldOptions.thresholds;\n    }\n\n    if (thresholds) {\n      fieldOptions.defaults.thresholds = {\n        mode: ThresholdsMode.Absolute,\n        steps: thresholds,\n      };\n    }\n\n    // Migrate color from simple string to a mode\n    const { defaults } = fieldOptions;\n    if (defaults.color && typeof defaults.color === 'string') {\n      defaults.color = {\n        mode: FieldColorModeId.Fixed,\n        fixedColor: defaults.color,\n      };\n    }\n\n    validateFieldConfig(defaults);\n  }\n\n  if (previousVersion < 7.0) {\n    panel.fieldConfig = panel.fieldConfig || { defaults: {}, overrides: [] };\n    panel.fieldConfig = {\n      defaults:\n        fieldOptions && fieldOptions.defaults\n          ? { ...panel.fieldConfig.defaults, ...fieldOptions.defaults }\n          : panel.fieldConfig.defaults,\n      overrides:\n        fieldOptions && fieldOptions.overrides\n          ? [...panel.fieldConfig.overrides, ...fieldOptions.overrides]\n          : panel.fieldConfig.overrides,\n    };\n\n    if (fieldOptions) {\n      options.reduceOptions = {\n        values: fieldOptions.values,\n        limit: fieldOptions.limit,\n        calcs: fieldOptions.calcs,\n      };\n    }\n\n    delete options.fieldOptions;\n  }\n\n  if (previousVersion < 7.1) {\n    // move title to displayName\n    const oldTitle = (panel.fieldConfig.defaults as any).title;\n    if (oldTitle !== undefined && oldTitle !== null) {\n      panel.fieldConfig.defaults.displayName = oldTitle;\n      delete (panel.fieldConfig.defaults as any).title;\n    }\n  }\n\n  if (previousVersion < 8.0) {\n    // Explicit min/max was removed for percent/percentunit in 8.0\n    const config = panel.fieldConfig?.defaults;\n    let unit = config?.unit;\n    if (unit === 'percent') {\n      if (!isNumber(config.min)) {\n        config.min = 0;\n      }\n      if (!isNumber(config.max)) {\n        config.max = 100;\n      }\n    } else if (unit === 'percentunit') {\n      if (!isNumber(config.min)) {\n        config.min = 0;\n      }\n      if (!isNumber(config.max)) {\n        config.max = 1;\n      }\n    }\n  }\n\n  return options;\n}\n\nexport function moveThresholdsAndMappingsToField(old: any) {\n  const { fieldOptions } = old;\n\n  if (!fieldOptions) {\n    return old;\n  }\n\n  const { mappings, ...rest } = old.fieldOptions;\n\n  let thresholds: ThresholdsConfig | undefined = undefined;\n  if (old.thresholds) {\n    thresholds = {\n      mode: ThresholdsMode.Absolute,\n      steps: migrateOldThresholds(old.thresholds)!,\n    };\n  }\n\n  return {\n    ...old,\n    fieldOptions: {\n      ...rest,\n      defaults: {\n        ...fieldOptions.defaults,\n        mappings,\n        thresholds,\n      },\n    },\n  };\n}\n\n/*\n * Moves valueMappings and thresholds from root to new fieldOptions object\n * Renames valueOptions to to defaults and moves it under fieldOptions\n */\nexport function migrateFromValueOptions(old: any) {\n  const { valueOptions } = old;\n  if (!valueOptions) {\n    return old;\n  }\n\n  const fieldOptions: any = {};\n  const fieldDefaults: any = {};\n\n  fieldOptions.mappings = old.valueMappings;\n  fieldOptions.thresholds = old.thresholds;\n  fieldOptions.defaults = fieldDefaults;\n\n  fieldDefaults.unit = valueOptions.unit;\n  fieldDefaults.decimals = valueOptions.decimals;\n\n  // Make sure the stats have a valid name\n  if (valueOptions.stat) {\n    const reducer = fieldReducers.get(valueOptions.stat);\n    if (reducer) {\n      fieldOptions.calcs = [reducer.id];\n    }\n  }\n\n  fieldDefaults.min = old.minValue;\n  fieldDefaults.max = old.maxValue;\n\n  const newOptions = {\n    ...old,\n    fieldOptions,\n  };\n\n  return omit(newOptions, 'valueMappings', 'thresholds', 'valueOptions', 'minValue', 'maxValue');\n}\n\nexport function migrateOldThresholds(thresholds?: any[]): Threshold[] | undefined {\n  if (!thresholds || !thresholds.length) {\n    return undefined;\n  }\n  const copy = thresholds.map((t) => {\n    return {\n      // Drops 'index'\n      value: t.value === null ? -Infinity : t.value,\n      color: t.color,\n    };\n  });\n  sortThresholds(copy);\n  copy[0].value = -Infinity;\n  return copy;\n}\n\n/**\n * @deprecated use convertOldAngularValueMappings instead\n * Convert the angular single stat mapping to new react style\n */\nexport function convertOldAngularValueMapping(panel: any): ValueMapping[] {\n  return convertOldAngularValueMappings(panel);\n}\n\ninterface GraphOptions {\n  xaxis: {\n    mode: 'series' | 'time' | 'histogram';\n    values?: string[];\n  };\n  legend: {\n    show: boolean;\n    alignAsTable: boolean;\n    rightSide: boolean;\n    values: boolean;\n    min?: boolean;\n    max?: boolean;\n    avg?: boolean;\n    current?: boolean;\n    total?: boolean;\n    sideWidth?: number;\n  };\n}\n\nfunction getReducersFromLegend(obj: Record<string, unknown>): string[] {\n  const ids: string[] = [];\n  for (const key in obj) {\n    const reducer = fieldReducers.getIfExists(key);\n    if (reducer) {\n      ids.push(reducer.id);\n    }\n  }\n  return ids;\n}\n\n// same as public/app/plugins/panel/barchart/migrations.ts\nfunction getReducerForMigration(reducers: string[] | undefined) {\n  const transformReducers: string[] = [];\n\n  reducers?.forEach((reducer) => {\n    // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n    if (!Object.values(ReducerID).includes(reducer as ReducerID)) {\n      if (reducer === 'current') {\n        transformReducers.push(ReducerID.lastNotNull);\n      } else if (reducer === 'total') {\n        transformReducers.push(ReducerID.sum);\n      } else if (reducer === 'avg') {\n        transformReducers.push(ReducerID.mean);\n      }\n    } else {\n      transformReducers.push(reducer);\n    }\n  });\n\n  return reducers ? transformReducers : [ReducerID.sum];\n}\n"],"names":[],"mappings":"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"}