TimeSeries: Add option to match axis color to series color (#51437)

pull/52427/head^2
Leon Sorokin 3 years ago committed by GitHub
parent 524948515c
commit a5a8052916
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      packages/grafana-schema/src/schema/mudball.cue
  2. 6
      packages/grafana-schema/src/schema/mudball.gen.ts
  3. 34
      packages/grafana-ui/src/components/TimeSeries/utils.ts
  4. 10
      packages/grafana-ui/src/components/uPlot/config/UPlotAxisBuilder.ts
  5. 14
      packages/grafana-ui/src/options/builder/axis.tsx

@ -5,6 +5,9 @@ package schema
// TODO docs // TODO docs
AxisPlacement: "auto" | "top" | "right" | "bottom" | "left" | "hidden" @cuetsy(kind="enum") AxisPlacement: "auto" | "top" | "right" | "bottom" | "left" | "hidden" @cuetsy(kind="enum")
// TODO docs
AxisColorMode: "text" | "series" @cuetsy(kind="enum")
// TODO docs // TODO docs
VisibilityMode: "auto" | "never" | "always" @cuetsy(kind="enum") VisibilityMode: "auto" | "never" | "always" @cuetsy(kind="enum")
@ -85,6 +88,7 @@ ScaleDistributionConfig: {
// TODO docs // TODO docs
AxisConfig: { AxisConfig: {
axisPlacement?: AxisPlacement axisPlacement?: AxisPlacement
axisColorMode?: AxisColorMode
axisLabel?: string axisLabel?: string
axisWidth?: number axisWidth?: number
axisSoftMin?: number axisSoftMin?: number

@ -15,6 +15,11 @@ export enum AxisPlacement {
Top = 'top', Top = 'top',
} }
export enum AxisColorMode {
Series = 'series',
Text = 'text',
}
export enum VisibilityMode { export enum VisibilityMode {
Always = 'always', Always = 'always',
Auto = 'auto', Auto = 'auto',
@ -118,6 +123,7 @@ export interface ScaleDistributionConfig {
} }
export interface AxisConfig { export interface AxisConfig {
axisColorMode?: AxisColorMode;
axisGridShow?: boolean; axisGridShow?: boolean;
axisLabel?: string; axisLabel?: string;
axisPlacement?: AxisPlacement; axisPlacement?: AxisPlacement;

@ -26,10 +26,13 @@ import {
ScaleOrientation, ScaleOrientation,
StackingMode, StackingMode,
GraphTransform, GraphTransform,
AxisColorMode,
GraphGradientMode,
} from '@grafana/schema'; } from '@grafana/schema';
import { buildScaleKey } from '../GraphNG/utils'; import { buildScaleKey } from '../GraphNG/utils';
import { UPlotConfigBuilder, UPlotConfigPrepFn } from '../uPlot/config/UPlotConfigBuilder'; import { UPlotConfigBuilder, UPlotConfigPrepFn } from '../uPlot/config/UPlotConfigBuilder';
import { getScaleGradientFn } from '../uPlot/config/gradientFills';
import { getStackingGroups, preparePlotData2 } from '../uPlot/utils'; import { getStackingGroups, preparePlotData2 } from '../uPlot/utils';
const defaultFormatter = (v: any) => (v == null ? '-' : v.toFixed(1)); const defaultFormatter = (v: any) => (v == null ? '-' : v.toFixed(1));
@ -192,6 +195,36 @@ export const preparePlotConfigBuilder: UPlotConfigPrepFn<{
} }
if (customConfig.axisPlacement !== AxisPlacement.Hidden) { if (customConfig.axisPlacement !== AxisPlacement.Hidden) {
let axisColor: uPlot.Axis.Stroke | undefined;
if (customConfig.axisColorMode === AxisColorMode.Series) {
if (
colorMode.isByValue &&
field.config.custom?.gradientMode === GraphGradientMode.Scheme &&
colorMode.id === FieldColorModeId.Thresholds
) {
axisColor = getScaleGradientFn(1, theme, colorMode, field.config.thresholds);
} else {
axisColor = seriesColor;
}
}
let axisColorOpts = {};
if (axisColor) {
axisColorOpts = {
border: {
show: true,
width: 1,
stroke: axisColor,
},
ticks: {
stroke: axisColor,
},
color: customConfig.axisColorMode === AxisColorMode.Series ? axisColor : undefined,
};
}
builder.addAxis( builder.addAxis(
tweakAxis( tweakAxis(
{ {
@ -203,6 +236,7 @@ export const preparePlotConfigBuilder: UPlotConfigPrepFn<{
theme, theme,
grid: { show: customConfig.axisGridShow }, grid: { show: customConfig.axisGridShow },
show: customConfig.hideFrom?.viz === false, show: customConfig.hideFrom?.viz === false,
...axisColorOpts,
}, },
field field
) )

@ -27,6 +27,8 @@ export interface AxisProps {
values?: Axis.Values; values?: Axis.Values;
isTime?: boolean; isTime?: boolean;
timeZone?: TimeZone; timeZone?: TimeZone;
color?: uPlot.Axis.Stroke;
border?: uPlot.Axis.Border;
} }
export const UPLOT_AXIS_FONT_SIZE = 12; export const UPLOT_AXIS_FONT_SIZE = 12;
@ -106,6 +108,8 @@ export class UPlotAxisBuilder extends PlotConfigBuilder<AxisProps, Axis> {
theme, theme,
tickLabelRotation, tickLabelRotation,
size, size,
color,
border,
} = this.props; } = this.props;
const font = `${UPLOT_AXIS_FONT_SIZE}px ${theme.typography.fontFamily}`; const font = `${UPLOT_AXIS_FONT_SIZE}px ${theme.typography.fontFamily}`;
@ -119,7 +123,7 @@ export class UPlotAxisBuilder extends PlotConfigBuilder<AxisProps, Axis> {
let config: Axis = { let config: Axis = {
scale: scaleKey, scale: scaleKey,
show, show,
stroke: theme.colors.text.primary, stroke: color ?? theme.colors.text.primary,
side: getUPlotSideFromAxis(placement), side: getUPlotSideFromAxis(placement),
font, font,
size: size:
@ -156,6 +160,10 @@ export class UPlotAxisBuilder extends PlotConfigBuilder<AxisProps, Axis> {
filter, filter,
}; };
if (border != null) {
config.border = border;
}
if (label != null && label.length > 0) { if (label != null && label.length > 0) {
config.label = label; config.label = label;
config.labelSize = UPLOT_AXIS_FONT_SIZE + labelPad; config.labelSize = UPLOT_AXIS_FONT_SIZE + labelPad;

@ -7,7 +7,7 @@ import {
SelectableValue, SelectableValue,
StandardEditorProps, StandardEditorProps,
} from '@grafana/data'; } from '@grafana/data';
import { AxisConfig, AxisPlacement, ScaleDistribution, ScaleDistributionConfig } from '@grafana/schema'; import { AxisColorMode, AxisConfig, AxisPlacement, ScaleDistribution, ScaleDistributionConfig } from '@grafana/schema';
import { graphFieldOptions, Select, HorizontalGroup, RadioButtonGroup } from '../../index'; import { graphFieldOptions, Select, HorizontalGroup, RadioButtonGroup } from '../../index';
@ -81,6 +81,18 @@ export function addAxisConfig(
{ value: false, label: 'Off' }, { value: false, label: 'Off' },
], ],
}, },
})
.addRadio({
path: 'axisColorMode',
name: 'Color',
category,
defaultValue: AxisColorMode.Text,
settings: {
options: [
{ value: AxisColorMode.Text, label: 'Text' },
{ value: AxisColorMode.Series, label: 'Series' },
],
},
}); });
if (!hideScale) { if (!hideScale) {

Loading…
Cancel
Save