Suggestions: Update ownership of core files and improve some types (#113254)

This commit is contained in:
Paul Marbach
2025-11-12 16:31:33 -05:00
committed by GitHub
parent cbd794d0b8
commit 3e31f7b713
13 changed files with 132 additions and 121 deletions
+2
View File
@@ -558,6 +558,7 @@ i18next.config.ts @grafana/grafana-frontend-platform
/packages/grafana-data/src/transformations/ @grafana/datapro
/packages/grafana-data/src/types/ @grafana/grafana-frontend-platform
/packages/grafana-data/src/types/scopes.ts @grafana/grafana-operator-experience-squad
/packages/grafana-data/src/types/suggestions.ts @grafana/dataviz-squad
/packages/grafana-data/src/utils/__snapshots__/ @grafanabot
/packages/grafana-data/src/utils/anyToNumber.ts @grafana/grafana-frontend-platform
/packages/grafana-data/src/utils/arrayUtils* @grafana/grafana-frontend-platform
@@ -942,6 +943,7 @@ playwright.storybook.config.ts @grafana/grafana-frontend-platform
/public/app/features/notifications/ @grafana/grafana-search-navigate-organise
/public/app/features/org/ @grafana/grafana-search-navigate-organise
/public/app/features/panel/ @grafana/dashboards-squad
/public/app/features/panel/suggestions/ @grafana/dataviz-squad
/public/app/features/playlist/ @grafana/dashboards-squad
/public/app/features/plugins/ @grafana/plugins-platform-frontend
/public/app/features/profile/ @grafana/grafana-frontend-platform
+1 -1
View File
@@ -237,7 +237,7 @@
},
"packages/grafana-data/src/types/panel.ts": {
"@typescript-eslint/no-explicit-any": {
"count": 13
"count": 11
}
},
"packages/grafana-data/src/types/plugin.ts": {
+7 -5
View File
@@ -651,12 +651,7 @@ export {
type PanelMenuItem,
type AngularPanelMenuItem,
type PanelPluginDataSupport,
type VisualizationSuggestion,
type VisualizationSuggestionsSupplier,
VizOrientation,
VisualizationSuggestionScore,
VisualizationSuggestionsBuilder,
VisualizationSuggestionsListAppender,
} from './types/panel';
export {
type DataSourcePluginOptionsEditorProps,
@@ -717,6 +712,13 @@ export {
type ApplyFieldOverrideOptions,
FieldConfigProperty,
} from './types/fieldOverrides';
export {
type VisualizationSuggestion,
type VisualizationSuggestionsSupplier,
VisualizationSuggestionScore,
VisualizationSuggestionsBuilder,
VisualizationSuggestionsListAppender,
} from './types/suggestions';
export {
type MatcherConfig,
type DataTransformContext,
@@ -7,7 +7,6 @@ import { PanelModel } from '../types/dashboard';
import { FieldConfigProperty, FieldConfigSource } from '../types/fieldOverrides';
import {
PanelPluginMeta,
VisualizationSuggestionsSupplier,
PanelProps,
PanelEditorProps,
PanelMigrationHandler,
@@ -15,6 +14,7 @@ import {
PanelPluginDataSupport,
} from '../types/panel';
import { GrafanaPlugin } from '../types/plugin';
import { VisualizationSuggestionsSupplier } from '../types/suggestions';
import { FieldConfigEditorBuilder, PanelOptionsEditorBuilder } from '../utils/OptionsUIBuilders';
import { deprecationWarning } from '../utils/deprecationWarning';
-96
View File
@@ -1,8 +1,5 @@
import { defaultsDeep } from 'lodash';
import { EventBus } from '../events/types';
import { StandardEditorProps } from '../field/standardFieldConfigEditorRegistry';
import { PanelDataSummary, getPanelDataSummary } from '../panel/suggestions/getPanelDataSummary';
import { Registry } from '../utils/Registry';
import { OptionsEditorItem } from './OptionsUIRegistryBuilder';
@@ -17,7 +14,6 @@ import { IconName } from './icon';
import { OptionEditorConfig } from './options';
import { PluginMeta } from './plugin';
import { AbsoluteTimeRange, TimeRange, TimeZone } from './time';
import { DataTransformerConfig } from './transformations';
export type InterpolateFunction = (value: string, scopedVars?: ScopedVars, format?: string | Function) => string;
@@ -219,95 +215,3 @@ export interface PanelPluginDataSupport {
annotations: boolean;
alertStates: boolean;
}
/**
* @alpha
*/
export interface VisualizationSuggestion<TOptions = any, TFieldConfig = any> {
/** Name of suggestion */
name: string;
/** Description */
description?: string;
/** Panel plugin id */
pluginId: string;
/** Panel plugin options */
options?: Partial<TOptions>;
/** Panel plugin field options */
fieldConfig?: FieldConfigSource<Partial<TFieldConfig>>;
/** Data transformations */
transformations?: DataTransformerConfig[];
/** Options for how to render suggestion card */
cardOptions?: {
/** Tweak for small preview */
previewModifier?: (suggestion: VisualizationSuggestion) => void;
icon?: string;
imgSrc?: string;
};
/** A value between 0-100 how suitable suggestion is */
score?: VisualizationSuggestionScore;
}
/**
* @alpha
*/
export enum VisualizationSuggestionScore {
/** We are pretty sure this is the best possible option */
Best = 100,
/** Should be a really good option */
Good = 70,
/** Can be visualized but there are likely better options. If no score is set this score is assumed */
OK = 50,
}
/**
* @alpha
*/
export class VisualizationSuggestionsBuilder {
/** Current data */
data?: PanelData;
/** Current panel & options */
panel?: PanelModel;
/** Summary stats for current data */
dataSummary: PanelDataSummary;
private list: VisualizationSuggestion[] = [];
constructor(data?: PanelData, panel?: PanelModel) {
this.data = data;
this.panel = panel;
this.dataSummary = getPanelDataSummary(this.data?.series);
}
getListAppender<TOptions, TFieldConfig>(defaults: VisualizationSuggestion<TOptions, TFieldConfig>) {
return new VisualizationSuggestionsListAppender<TOptions, TFieldConfig>(this.list, defaults);
}
getList() {
return this.list;
}
}
/**
* @alpha
*/
export type VisualizationSuggestionsSupplier = {
/**
* Adds good suitable suggestions for the current data
*/
getSuggestionsForData: (builder: VisualizationSuggestionsBuilder) => void;
};
/**
* Helps with typings and defaults
* @alpha
*/
export class VisualizationSuggestionsListAppender<TOptions, TFieldConfig> {
constructor(
private list: VisualizationSuggestion[],
private defaults: VisualizationSuggestion<TOptions, TFieldConfig>
) {}
append(overrides: Partial<VisualizationSuggestion<TOptions, TFieldConfig>>) {
this.list.push(defaultsDeep(overrides, this.defaults));
}
}
@@ -0,0 +1,100 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import { defaultsDeep } from 'lodash';
import { DataTransformerConfig } from '@grafana/schema';
import { PanelDataSummary, getPanelDataSummary } from '../panel/suggestions/getPanelDataSummary';
import { PanelModel } from './dashboard';
import { FieldConfigSource } from './fieldOverrides';
import { PanelData } from './panel';
/**
* @alpha
*/
export interface VisualizationSuggestion<TOptions = any, TFieldConfig = any> {
/** Name of suggestion */
name: string;
/** Description */
description?: string;
/** Panel plugin id */
pluginId: string;
/** Panel plugin options */
options?: Partial<TOptions>;
/** Panel plugin field options */
fieldConfig?: FieldConfigSource<Partial<TFieldConfig>>;
/** Data transformations */
transformations?: DataTransformerConfig[];
/** Options for how to render suggestion card */
cardOptions?: {
/** Tweak for small preview */
previewModifier?: (suggestion: VisualizationSuggestion) => void;
icon?: string;
imgSrc?: string;
};
/** A value between 0-100 how suitable suggestion is */
score?: VisualizationSuggestionScore;
}
/**
* @alpha
*/
export enum VisualizationSuggestionScore {
/** We are pretty sure this is the best possible option */
Best = 100,
/** Should be a really good option */
Good = 70,
/** Can be visualized but there are likely better options. If no score is set this score is assumed */
OK = 50,
}
/**
* @alpha
*/
export class VisualizationSuggestionsBuilder {
/** Summary stats for current data */
dataSummary: PanelDataSummary;
private list: VisualizationSuggestion[] = [];
constructor(
/** Current data */
public data?: PanelData,
/** Current panel & options */
public panel?: PanelModel
) {
this.dataSummary = getPanelDataSummary(data?.series);
}
getListAppender<TOptions, TFieldConfig>(defaults: VisualizationSuggestion<TOptions, TFieldConfig>) {
return new VisualizationSuggestionsListAppender<TOptions, TFieldConfig>(this.list, defaults);
}
getList() {
return this.list;
}
}
/**
* @alpha
*/
export type VisualizationSuggestionsSupplier = {
/**
* Adds good suitable suggestions for the current data
*/
getSuggestionsForData: (builder: VisualizationSuggestionsBuilder) => void;
};
/**
* Helps with typings and defaults
* @alpha
*/
export class VisualizationSuggestionsListAppender<TOptions, TFieldConfig> {
constructor(
private list: VisualizationSuggestion[],
private defaults: VisualizationSuggestion<TOptions, TFieldConfig>
) {}
append(overrides: Partial<VisualizationSuggestion<TOptions, TFieldConfig>>) {
this.list.push(defaultsDeep(overrides, this.defaults));
}
}
@@ -7,7 +7,7 @@ import { GrafanaTheme2, PanelData, PanelModel, VisualizationSuggestion } from '@
import { Trans } from '@grafana/i18n';
import { useStyles2 } from '@grafana/ui';
import { getAllSuggestions } from '../../state/getAllSuggestions';
import { getAllSuggestions } from '../../suggestions/getAllSuggestions';
import { VisualizationSuggestionCard } from './VisualizationSuggestionCard';
import { VizTypeChangeDetails } from './types';
@@ -8,6 +8,7 @@ import {
toDataFrame,
VisualizationSuggestion,
} from '@grafana/data';
import { GraphFieldConfig, ReduceDataOptions } from '@grafana/schema';
import { config } from 'app/core/config';
import { SuggestionName } from 'app/types/suggestions';
@@ -32,7 +33,7 @@ config.panels['text'] = {
class ScenarioContext {
data: DataFrame[] = [];
suggestions: VisualizationSuggestion[] = [];
suggestions: Array<VisualizationSuggestion<{ reduceOptions?: ReduceDataOptions }, GraphFieldConfig>> = [];
setData(scenarioData: DataFrame[]) {
this.data = scenarioData;
@@ -1,4 +1,4 @@
import { VisualizationSuggestionsBuilder, VizOrientation } from '@grafana/data';
import { FieldColorModeId, VisualizationSuggestionsBuilder, VizOrientation } from '@grafana/data';
import { BarGaugeDisplayMode } from '@grafana/ui';
import { SuggestionName } from 'app/types/suggestions';
@@ -44,7 +44,7 @@ export class BarGaugeSuggestionsSupplier {
fieldConfig: {
defaults: {
color: {
mode: 'continuous-GrYlRd',
mode: FieldColorModeId.ContinuousGrYlRd,
},
},
overrides: [],
@@ -64,7 +64,7 @@ export class BarGaugeSuggestionsSupplier {
fieldConfig: {
defaults: {
color: {
mode: 'continuous-GrYlRd',
mode: FieldColorModeId.ContinuousGrYlRd,
},
},
overrides: [],
@@ -84,7 +84,7 @@ export class BarGaugeSuggestionsSupplier {
fieldConfig: {
defaults: {
color: {
mode: 'continuous-GrYlRd',
mode: FieldColorModeId.ContinuousGrYlRd,
},
},
overrides: [],
@@ -104,7 +104,7 @@ export class BarGaugeSuggestionsSupplier {
fieldConfig: {
defaults: {
color: {
mode: 'continuous-GrYlRd',
mode: FieldColorModeId.ContinuousGrYlRd,
},
},
overrides: [],
@@ -1,4 +1,5 @@
import { ThresholdsMode, VisualizationSuggestionsBuilder } from '@grafana/data';
import { GraphFieldConfig } from '@grafana/ui';
import { SuggestionName } from 'app/types/suggestions';
import { Options } from './panelcfg.gen';
@@ -16,7 +17,7 @@ export class GaugeSuggestionsSupplier {
return;
}
const list = builder.getListAppender<Options, {}>({
const list = builder.getListAppender<Options, GraphFieldConfig>({
name: SuggestionName.Gauge,
pluginId: 'gauge',
options: {},
@@ -36,8 +37,8 @@ export class GaugeSuggestionsSupplier {
},
cardOptions: {
previewModifier: (s) => {
if (s.options!.reduceOptions.values) {
s.options!.reduceOptions.limit = 2;
if (s.options?.reduceOptions?.values) {
s.options.reduceOptions.limit = 2;
}
},
},
@@ -1,5 +1,6 @@
import { VisualizationSuggestionsBuilder } from '@grafana/data';
import { FieldColorModeId } from '@grafana/schema/dist/esm/index.gen';
import { FieldColorModeId } from '@grafana/schema';
import { GraphFieldConfig } from '@grafana/ui';
import { SuggestionName } from 'app/types/suggestions';
import { Options } from './panelcfg.gen';
@@ -17,7 +18,7 @@ export class GaugeSuggestionsSupplier {
return;
}
const list = builder.getListAppender<Options, {}>({
const list = builder.getListAppender<Options, GraphFieldConfig>({
name: SuggestionName.Gauge,
pluginId: 'gauge',
options: {},
@@ -27,8 +28,8 @@ export class GaugeSuggestionsSupplier {
},
cardOptions: {
previewModifier: (s) => {
if (s.options!.reduceOptions.values) {
s.options!.reduceOptions.limit = 2;
if (s.options?.reduceOptions?.values) {
s.options.reduceOptions.limit = 2;
}
},
},
+4 -4
View File
@@ -1,5 +1,5 @@
import { VisualizationSuggestionsBuilder } from '@grafana/data';
import { BigValueColorMode, BigValueGraphMode } from '@grafana/schema';
import { BigValueColorMode, BigValueGraphMode, GraphFieldConfig } from '@grafana/schema';
import { SuggestionName } from 'app/types/suggestions';
import { Options } from './panelcfg.gen';
@@ -12,7 +12,7 @@ export class StatSuggestionsSupplier {
return;
}
const list = builder.getListAppender<Options, {}>({
const list = builder.getListAppender<Options, GraphFieldConfig>({
name: SuggestionName.Stat,
pluginId: 'stat',
options: {},
@@ -25,8 +25,8 @@ export class StatSuggestionsSupplier {
},
cardOptions: {
previewModifier: (s) => {
if (s.options!.reduceOptions.values) {
s.options!.reduceOptions.limit = 1;
if (s.options?.reduceOptions?.values) {
s.options.reduceOptions.limit = 1;
}
},
},