Suggestions: Update ownership of core files and improve some types (#113254)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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';
|
||||
|
||||
|
||||
@@ -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';
|
||||
|
||||
+2
-1
@@ -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;
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user