{"version":3,"file":"getPanelOptionsWithDefaults.mjs","sources":["../../../src/panel/getPanelOptionsWithDefaults.ts"],"sourcesContent":["import { mergeWith, isArray, isObject, unset, isEqual } from 'lodash';\n\nimport { FieldConfigOptionsRegistry } from '../field/FieldConfigOptionsRegistry';\nimport { fieldColorModeRegistry } from '../field/fieldColor';\nimport { FieldColorConfigSettings } from '../field/overrides/processors';\nimport { FieldColorModeId } from '../types/fieldColor';\nimport {\n  ConfigOverrideRule,\n  DynamicConfigValue,\n  FieldConfigProperty,\n  FieldConfigSource,\n} from '../types/fieldOverrides';\nimport { ThresholdsConfig, ThresholdsMode } from '../types/thresholds';\n\nimport { PanelPlugin } from './PanelPlugin';\n\ninterface Props {\n  plugin: PanelPlugin;\n  currentFieldConfig: FieldConfigSource;\n  currentOptions: Record<string, unknown>;\n  isAfterPluginChange: boolean;\n}\n\nexport interface OptionDefaults {\n  options: Record<string, unknown>;\n  fieldConfig: FieldConfigSource;\n}\n\n/**\n * This will return the panel options with defaults applied.\n * Used internally, not intended for external use.\n * @internal\n */\nexport function getPanelOptionsWithDefaults({\n  plugin,\n  currentOptions,\n  currentFieldConfig,\n  isAfterPluginChange,\n}: Props): OptionDefaults {\n  const optionsWithDefaults = mergeWith({}, plugin.defaults, currentOptions || {}, (objValue, srcValue) => {\n    if (isArray(srcValue)) {\n      return srcValue;\n    }\n    return;\n  });\n\n  const fieldConfigWithDefaults = applyFieldConfigDefaults(currentFieldConfig, plugin);\n  const fieldConfigWithOptimalColorMode = adaptFieldColorMode(plugin, fieldConfigWithDefaults, isAfterPluginChange);\n\n  return { options: optionsWithDefaults, fieldConfig: fieldConfigWithOptimalColorMode };\n}\n\nfunction applyFieldConfigDefaults(existingFieldConfig: FieldConfigSource, plugin: PanelPlugin): FieldConfigSource {\n  const pluginDefaults = plugin.fieldConfigDefaults;\n\n  const result: FieldConfigSource = {\n    defaults: mergeWith(\n      {},\n      pluginDefaults.defaults,\n      existingFieldConfig ? existingFieldConfig.defaults : {},\n      (objValue, srcValue) => {\n        if (isArray(srcValue)) {\n          return srcValue;\n        }\n        return;\n      }\n    ),\n    overrides: existingFieldConfig?.overrides ?? [],\n  };\n\n  cleanProperties(result.defaults, '', plugin.fieldConfigRegistry);\n\n  // Thresholds base values are null in JSON but need to be converted to -Infinity\n  if (result.defaults.thresholds) {\n    fixThresholds(result.defaults.thresholds);\n  }\n\n  // Filter out overrides for properties that cannot be found in registry\n  result.overrides = filterFieldConfigOverrides(result.overrides, (prop) => {\n    return plugin.fieldConfigRegistry.getIfExists(prop.id) !== undefined;\n  });\n\n  for (const override of result.overrides) {\n    for (const property of override.properties) {\n      if (property.id === 'thresholds') {\n        fixThresholds(property.value);\n      }\n    }\n  }\n\n  return result;\n}\n\n/**\n * Used internally, not intended for external use.\n * @internal\n */\nexport function filterFieldConfigOverrides(\n  overrides: ConfigOverrideRule[],\n  condition: (value: DynamicConfigValue) => boolean\n): ConfigOverrideRule[] {\n  return overrides.map((x) => {\n    const properties = x.properties.filter(condition);\n\n    return {\n      ...x,\n      properties,\n    };\n  });\n}\n\nfunction cleanProperties(obj: object, parentPath: string, fieldConfigRegistry: FieldConfigOptionsRegistry) {\n  let found = false;\n\n  for (const [propName, value] of Object.entries(obj)) {\n    const fullPath = `${parentPath}${propName}`;\n    const existsInRegistry = !!fieldConfigRegistry.getIfExists(fullPath);\n\n    // need to check early here as some standard properties have nested properies\n    if (existsInRegistry) {\n      found = true;\n      continue;\n    }\n\n    if (isArray(value) || !isObject(value)) {\n      if (!existsInRegistry) {\n        unset(obj, propName);\n      }\n    } else {\n      const childPropFound = cleanProperties(value, `${fullPath}.`, fieldConfigRegistry);\n      // If no child props found unset the main object\n      if (!childPropFound) {\n        unset(obj, propName);\n      }\n    }\n  }\n\n  return found;\n}\n\nfunction adaptFieldColorMode(\n  plugin: PanelPlugin,\n  fieldConfig: FieldConfigSource,\n  isAfterPluginChange: boolean\n): FieldConfigSource {\n  if (!isAfterPluginChange) {\n    return fieldConfig;\n  }\n\n  // adjust to prefered field color setting if needed\n  const color = plugin.fieldConfigRegistry.getIfExists(FieldConfigProperty.Color);\n\n  if (color && color.settings) {\n    const colorSettings: FieldColorConfigSettings = color.settings;\n    const mode = fieldColorModeRegistry.getIfExists(fieldConfig.defaults.color?.mode);\n\n    // When no support fo value colors, use classic palette\n    if (!colorSettings.byValueSupport) {\n      if (!mode || mode.isByValue) {\n        fieldConfig.defaults.color = { mode: FieldColorModeId.PaletteClassic };\n        return fieldConfig;\n      }\n    }\n\n    // When supporting value colors and prefering thresholds, use Thresholds mode.\n    // Otherwise keep current mode\n    if (colorSettings.byValueSupport && colorSettings.preferThresholdsMode && mode?.id !== FieldColorModeId.Fixed) {\n      if (!mode || !mode.isByValue) {\n        fieldConfig.defaults.color = { mode: FieldColorModeId.Thresholds };\n        return fieldConfig;\n      }\n    }\n\n    // If panel support bySeries then we should default to that when switching to this panel as that is most likely\n    // what users will expect. Example scenario a user who has a graph panel (time series) and switches to Gauge and\n    // then back to time series we want the graph panel color mode to reset to classic palette and not preserve the\n    // Gauge prefered thresholds mode.\n    if (colorSettings.bySeriesSupport && mode?.isByValue) {\n      fieldConfig.defaults.color = { mode: FieldColorModeId.PaletteClassic };\n      return fieldConfig;\n    }\n  }\n  return fieldConfig;\n}\n\nfunction fixThresholds(thresholds: ThresholdsConfig) {\n  if (!thresholds.mode) {\n    thresholds.mode = ThresholdsMode.Absolute;\n  }\n\n  if (!thresholds.steps) {\n    thresholds.steps = [];\n  } else if (thresholds.steps.length) {\n    // First value is always -Infinity\n    // JSON saves it as null\n    thresholds.steps[0].value = -Infinity;\n  }\n}\n\n/**\n * Used internally, not intended for external use.\n * @internal\n */\nexport function restoreCustomOverrideRules(current: FieldConfigSource, old: FieldConfigSource): FieldConfigSource {\n  const result = {\n    defaults: {\n      ...current.defaults,\n      custom: old.defaults.custom,\n    },\n    overrides: [...current.overrides],\n  };\n\n  for (const override of old.overrides) {\n    for (const prop of override.properties) {\n      if (isCustomFieldProp(prop)) {\n        const currentOverride = result.overrides.find((o) => isEqual(o.matcher, override.matcher));\n        if (currentOverride) {\n          if (currentOverride !== override) {\n            currentOverride.properties.push(prop);\n          }\n        } else {\n          result.overrides.push(override);\n        }\n      }\n    }\n  }\n\n  return result;\n}\n\n/**\n * Used internally, not intended for external use.\n * @internal\n */\nexport function isCustomFieldProp(prop: DynamicConfigValue): boolean {\n  return prop.id.startsWith('custom.');\n}\n\n/**\n * Used internally, not intended for external use.\n * @internal\n */\nexport function isStandardFieldProp(prop: DynamicConfigValue): boolean {\n  return !isCustomFieldProp(prop);\n}\n"],"names":[],"mappings":"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"}