@grafana/ui
Version:
Grafana Components Library
1 lines • 22.4 kB
Source Map (JSON)
{"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' || prevPluginId === 'grafana-singlestat-panel') && 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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"}