Moved the rest of Threshold dependencies to ui/components

This commit is contained in:
Hugo Häggmark 2019-01-11 08:30:30 +01:00
parent c05b92c2e0
commit c54ec5f52f
16 changed files with 76 additions and 108 deletions

View File

@ -1,13 +1,12 @@
import React from 'react'; import React from 'react';
import { shallow } from 'enzyme'; import { shallow } from 'enzyme';
import { PanelOptionsProps } from '@grafana/ui'; import { BasicGaugeColor, GaugeOptions, PanelOptionsProps } from '@grafana/ui';
import { defaultProps } from 'app/plugins/panel/gauge/GaugePanelOptions'; import { defaultProps } from 'app/plugins/panel/gauge/GaugePanelOptions';
import { Options } from 'app/plugins/panel/gauge/types';
import { BasicGaugeColor } from 'app/types';
import { ThresholdsEditor } from './ThresholdsEditor'; import { ThresholdsEditor } from './ThresholdsEditor';
const setup = (propOverrides?: object) => { const setup = (propOverrides?: object) => {
const props: PanelOptionsProps<Options> = { const props: PanelOptionsProps<GaugeOptions> = {
onChange: jest.fn(), onChange: jest.fn(),
options: { options: {
...defaultProps.options, ...defaultProps.options,

View File

@ -1,26 +1,20 @@
import React, { PureComponent } from 'react'; import React, { PureComponent } from 'react';
import tinycolor from 'tinycolor2'; import tinycolor, { ColorInput } from 'tinycolor2';
import { ColorPicker } from '@grafana/ui'; import { BasicGaugeColor, ColorPicker, GaugeOptions, PanelOptionsProps, Threshold } from '@grafana/ui';
import { BasicGaugeColor } from 'app/types';
import { PanelOptionsProps, Threshold } from '@grafana/ui';
import { Options } from 'app/plugins/panel/gauge/types';
interface State { interface State {
thresholds: Threshold[]; thresholds: Threshold[];
baseColor: string; baseColor: string;
} }
export class ThresholdsEditor extends PureComponent<PanelOptionsProps<Options>, State> { export class ThresholdsEditor extends PureComponent<PanelOptionsProps<GaugeOptions>, State> {
constructor(props) { constructor(props: PanelOptionsProps<GaugeOptions>) {
super(props); super(props);
this.state = { this.state = { thresholds: props.options.thresholds, baseColor: props.options.baseColor };
thresholds: props.options.thresholds,
baseColor: props.options.baseColor,
};
} }
onAddThreshold = index => { onAddThreshold = (index: number) => {
const { maxValue, minValue } = this.props.options; const { maxValue, minValue } = this.props.options;
const { thresholds } = this.state; const { thresholds } = this.state;
@ -48,27 +42,25 @@ export class ThresholdsEditor extends PureComponent<PanelOptionsProps<Options>,
if (index === 0 && thresholds.length === 0) { if (index === 0 && thresholds.length === 0) {
color = tinycolor.mix(BasicGaugeColor.Green, BasicGaugeColor.Red, 50).toRgbString(); color = tinycolor.mix(BasicGaugeColor.Green, BasicGaugeColor.Red, 50).toRgbString();
} else { } else {
color = tinycolor.mix(thresholds[index - 1].color, BasicGaugeColor.Red, 50).toRgbString(); color = tinycolor.mix(thresholds[index - 1].color as ColorInput, BasicGaugeColor.Red, 50).toRgbString();
} }
this.setState( this.setState(
{ {
thresholds: this.sortThresholds([...newThresholds, { index: index, value: value, color: color }]), thresholds: this.sortThresholds([...newThresholds, { index, value: value as number, color }]),
}, },
() => this.updateGauge() () => this.updateGauge()
); );
}; };
onRemoveThreshold = threshold => { onRemoveThreshold = (threshold: Threshold) => {
this.setState( this.setState(
prevState => ({ prevState => ({ thresholds: prevState.thresholds.filter(t => t !== threshold) }),
thresholds: prevState.thresholds.filter(t => t !== threshold),
}),
() => this.updateGauge() () => this.updateGauge()
); );
}; };
onChangeThresholdValue = (event, threshold) => { onChangeThresholdValue = (event: any, threshold: Threshold) => {
const { thresholds } = this.state; const { thresholds } = this.state;
const newThresholds = thresholds.map(t => { const newThresholds = thresholds.map(t => {
@ -79,12 +71,10 @@ export class ThresholdsEditor extends PureComponent<PanelOptionsProps<Options>,
return t; return t;
}); });
this.setState({ this.setState({ thresholds: newThresholds });
thresholds: newThresholds,
});
}; };
onChangeThresholdColor = (threshold, color) => { onChangeThresholdColor = (threshold: Threshold, color: string) => {
const { thresholds } = this.state; const { thresholds } = this.state;
const newThresholds = thresholds.map(t => { const newThresholds = thresholds.map(t => {
@ -103,11 +93,9 @@ export class ThresholdsEditor extends PureComponent<PanelOptionsProps<Options>,
); );
}; };
onChangeBaseColor = color => this.props.onChange({ ...this.props.options, baseColor: color }); onChangeBaseColor = (color: string) => this.props.onChange({ ...this.props.options, baseColor: color });
onBlur = () => { onBlur = () => {
this.setState(prevState => ({ this.setState(prevState => ({ thresholds: this.sortThresholds(prevState.thresholds) }));
thresholds: this.sortThresholds(prevState.thresholds),
}));
this.updateGauge(); this.updateGauge();
}; };
@ -116,7 +104,7 @@ export class ThresholdsEditor extends PureComponent<PanelOptionsProps<Options>,
this.props.onChange({ ...this.props.options, thresholds: this.state.thresholds }); this.props.onChange({ ...this.props.options, thresholds: this.state.thresholds });
}; };
sortThresholds = thresholds => { sortThresholds = (thresholds: Threshold[]) => {
return thresholds.sort((t1, t2) => { return thresholds.sort((t1, t2) => {
return t2.value - t1.value; return t2.value - t1.value;
}); });
@ -161,20 +149,8 @@ export class ThresholdsEditor extends PureComponent<PanelOptionsProps<Options>,
return thresholds.map((t, i) => { return thresholds.map((t, i) => {
return ( return (
<div key={`${t.value}-${i}`} className="indicator-section"> <div key={`${t.value}-${i}`} className="indicator-section">
<div <div onClick={() => this.onAddThreshold(t.index + 1)} style={{ height: '50%', backgroundColor: t.color }} />
onClick={() => this.onAddThreshold(t.index + 1)} <div onClick={() => this.onAddThreshold(t.index)} style={{ height: '50%', backgroundColor: t.color }} />
style={{
height: '50%',
backgroundColor: t.color,
}}
/>
<div
onClick={() => this.onAddThreshold(t.index)}
style={{
height: '50%',
backgroundColor: t.color,
}}
/>
</div> </div>
); );
}); });

View File

@ -1,6 +1,6 @@
import { RangeMap, ValueMap, Threshold } from 'app/types'; import { RangeMap, Threshold, ValueMap } from '@grafana/ui';
export interface Options { export interface GaugeOptions {
baseColor: string; baseColor: string;
decimals: number; decimals: number;
mappings: Array<RangeMap | ValueMap>; mappings: Array<RangeMap | ValueMap>;

View File

@ -1,3 +1,4 @@
export * from './series'; export * from './series';
export * from './time'; export * from './time';
export * from './panel'; export * from './panel';
export * from './gauge';

View File

@ -35,3 +35,29 @@ export interface Threshold {
value: number; value: number;
color?: string; color?: string;
} }
export enum BasicGaugeColor {
Green = '#299c46',
Red = '#d44a3a',
}
export enum MappingType {
ValueToText = 1,
RangeToText = 2,
}
interface BaseMap {
id: number;
operator: string;
text: string;
type: MappingType;
}
export interface ValueMap extends BaseMap {
value: string;
}
export interface RangeMap extends BaseMap {
from: string;
to: string;
}

View File

@ -1,10 +1,10 @@
import React, { PureComponent } from 'react'; import React, { PureComponent } from 'react';
import { GaugeOptions, PanelOptionsProps } from '@grafana/ui';
import { Switch } from 'app/core/components/Switch/Switch'; import { Switch } from 'app/core/components/Switch/Switch';
import { Label } from '../../../core/components/Label/Label'; import { Label } from '../../../core/components/Label/Label';
import { PanelOptionsProps } from '@grafana/ui';
import { Options } from './types';
export default class GaugeOptions extends PureComponent<PanelOptionsProps<Options>> { export default class GaugeOptionsEditor extends PureComponent<PanelOptionsProps<GaugeOptions>> {
onToggleThresholdLabels = () => onToggleThresholdLabels = () =>
this.props.onChange({ ...this.props.options, showThresholdLabels: !this.props.options.showThresholdLabels }); this.props.onChange({ ...this.props.options, showThresholdLabels: !this.props.options.showThresholdLabels });

View File

@ -1,10 +1,10 @@
import React, { PureComponent } from 'react'; import React, { PureComponent } from 'react';
import { PanelProps, NullValueMode } from '@grafana/ui'; import { GaugeOptions, PanelProps, NullValueMode } from '@grafana/ui';
import { getTimeSeriesVMs } from 'app/viz/state/timeSeries'; import { getTimeSeriesVMs } from 'app/viz/state/timeSeries';
import Gauge from 'app/viz/Gauge'; import Gauge from 'app/viz/Gauge';
import { Options } from './types';
interface Props extends PanelProps<Options> {} interface Props extends PanelProps<GaugeOptions> {}
export class GaugePanel extends PureComponent<Props> { export class GaugePanel extends PureComponent<Props> {
render() { render() {

View File

@ -1,10 +1,9 @@
import React, { PureComponent } from 'react'; import React, { PureComponent } from 'react';
import { BasicGaugeColor, GaugeOptions, PanelOptionsProps, ThresholdsEditor } from '@grafana/ui';
import ValueOptions from 'app/plugins/panel/gauge/ValueOptions'; import ValueOptions from 'app/plugins/panel/gauge/ValueOptions';
import { BasicGaugeColor } from 'app/types';
import { PanelOptionsProps, ThresholdsEditor } from '@grafana/ui';
import ValueMappings from 'app/plugins/panel/gauge/ValueMappings'; import ValueMappings from 'app/plugins/panel/gauge/ValueMappings';
import { Options } from './types'; import GaugeOptionsEditor from './GaugeOptionsEditor';
import GaugeOptions from './GaugeOptions';
export const defaultProps = { export const defaultProps = {
options: { options: {
@ -23,7 +22,7 @@ export const defaultProps = {
}, },
}; };
export default class GaugePanelOptions extends PureComponent<PanelOptionsProps<Options>> { export default class GaugePanelOptions extends PureComponent<PanelOptionsProps<GaugeOptions>> {
static defaultProps = defaultProps; static defaultProps = defaultProps;
render() { render() {
@ -32,7 +31,7 @@ export default class GaugePanelOptions extends PureComponent<PanelOptionsProps<O
<> <>
<div className="form-section"> <div className="form-section">
<ValueOptions onChange={onChange} options={options} /> <ValueOptions onChange={onChange} options={options} />
<GaugeOptions onChange={onChange} options={options} /> <GaugeOptionsEditor onChange={onChange} options={options} />
<ThresholdsEditor onChange={onChange} options={options} /> <ThresholdsEditor onChange={onChange} options={options} />
</div> </div>

View File

@ -1,7 +1,8 @@
import React, { PureComponent } from 'react'; import React, { PureComponent } from 'react';
import { MappingType, RangeMap, ValueMap } from '@grafana/ui';
import { Label } from 'app/core/components/Label/Label'; import { Label } from 'app/core/components/Label/Label';
import { Select } from 'app/core/components/Select/Select'; import { Select } from 'app/core/components/Select/Select';
import { MappingType, RangeMap, ValueMap } from 'app/types';
interface Props { interface Props {
mapping: ValueMap | RangeMap; mapping: ValueMap | RangeMap;

View File

@ -1,13 +1,12 @@
import React from 'react'; import React from 'react';
import { shallow } from 'enzyme'; import { shallow } from 'enzyme';
import { GaugeOptions, MappingType, PanelOptionsProps } from '@grafana/ui';
import ValueMappings from './ValueMappings'; import ValueMappings from './ValueMappings';
import { MappingType } from 'app/types';
import { PanelOptionsProps } from '@grafana/ui';
import { Options } from './types';
import { defaultProps } from 'app/plugins/panel/gauge/GaugePanelOptions'; import { defaultProps } from 'app/plugins/panel/gauge/GaugePanelOptions';
const setup = (propOverrides?: object) => { const setup = (propOverrides?: object) => {
const props: PanelOptionsProps<Options> = { const props: PanelOptionsProps<GaugeOptions> = {
onChange: jest.fn(), onChange: jest.fn(),
options: { options: {
...defaultProps.options, ...defaultProps.options,

View File

@ -1,15 +1,14 @@
import React, { PureComponent } from 'react'; import React, { PureComponent } from 'react';
import { GaugeOptions, PanelOptionsProps, MappingType, RangeMap, ValueMap } from '@grafana/ui';
import MappingRow from './MappingRow'; import MappingRow from './MappingRow';
import { MappingType, RangeMap, ValueMap } from 'app/types';
import { PanelOptionsProps } from '@grafana/ui';
import { Options } from './types';
interface State { interface State {
mappings: Array<ValueMap | RangeMap>; mappings: Array<ValueMap | RangeMap>;
nextIdToAdd: number; nextIdToAdd: number;
} }
export default class ValueMappings extends PureComponent<PanelOptionsProps<Options>, State> { export default class ValueMappings extends PureComponent<PanelOptionsProps<GaugeOptions>, State> {
constructor(props) { constructor(props) {
super(props); super(props);

View File

@ -1,9 +1,9 @@
import React, { PureComponent } from 'react'; import React, { PureComponent } from 'react';
import { GaugeOptions, PanelOptionsProps } from '@grafana/ui';
import { Label } from 'app/core/components/Label/Label'; import { Label } from 'app/core/components/Label/Label';
import Select from 'app/core/components/Select/Select'; import Select from 'app/core/components/Select/Select';
import UnitPicker from 'app/core/components/Select/UnitPicker'; import UnitPicker from 'app/core/components/Select/UnitPicker';
import { PanelOptionsProps } from '@grafana/ui';
import { Options } from './types';
const statOptions = [ const statOptions = [
{ value: 'min', label: 'Min' }, { value: 'min', label: 'Min' },
@ -21,7 +21,7 @@ const statOptions = [
const labelWidth = 6; const labelWidth = 6;
export default class ValueOptions extends PureComponent<PanelOptionsProps<Options>> { export default class ValueOptions extends PureComponent<PanelOptionsProps<GaugeOptions>> {
onUnitChange = unit => this.props.onChange({ ...this.props.options, unit: unit.value }); onUnitChange = unit => this.props.onChange({ ...this.props.options, unit: unit.value });
onStatChange = stat => this.props.onChange({ ...this.props.options, stat: stat.value }); onStatChange = stat => this.props.onChange({ ...this.props.options, stat: stat.value });

View File

@ -9,7 +9,6 @@ import { ApiKey, ApiKeysState, NewApiKey } from './apiKeys';
import { Invitee, OrgUser, User, UsersState, UserState } from './user'; import { Invitee, OrgUser, User, UsersState, UserState } from './user';
import { DataSource, DataSourceSelectItem, DataSourcesState } from './datasources'; import { DataSource, DataSourceSelectItem, DataSourcesState } from './datasources';
import { DataQuery, DataQueryResponse, DataQueryOptions } from './series'; import { DataQuery, DataQueryResponse, DataQueryOptions } from './series';
import { BasicGaugeColor, MappingType, RangeMap, ValueMap } from './panel';
import { PluginDashboard, PluginMeta, Plugin, PanelPlugin, PluginsState } from './plugins'; import { PluginDashboard, PluginMeta, Plugin, PanelPlugin, PluginsState } from './plugins';
import { Organization, OrganizationState } from './organization'; import { Organization, OrganizationState } from './organization';
import { import {
@ -20,7 +19,6 @@ import {
} from './appNotifications'; } from './appNotifications';
import { DashboardSearchHit } from './search'; import { DashboardSearchHit } from './search';
import { ValidationEvents, ValidationRule } from './form'; import { ValidationEvents, ValidationRule } from './form';
import { Threshold } from '@grafana/ui';
export { export {
Team, Team,
TeamsState, TeamsState,
@ -70,13 +68,8 @@ export {
AppNotificationTimeout, AppNotificationTimeout,
DashboardSearchHit, DashboardSearchHit,
UserState, UserState,
Threshold,
ValidationEvents, ValidationEvents,
ValidationRule, ValidationRule,
ValueMap,
RangeMap,
MappingType,
BasicGaugeColor,
}; };
export interface StoreState { export interface StoreState {

View File

@ -1,25 +0,0 @@
export enum MappingType {
ValueToText = 1,
RangeToText = 2,
}
export enum BasicGaugeColor {
Green = '#299c46',
Red = '#d44a3a',
}
interface BaseMap {
id: number;
operator: string;
text: string;
type: MappingType;
}
export interface ValueMap extends BaseMap {
value: string;
}
export interface RangeMap extends BaseMap {
from: string;
to: string;
}

View File

@ -1,8 +1,8 @@
import React from 'react'; import React from 'react';
import { shallow } from 'enzyme'; import { shallow } from 'enzyme';
import { BasicGaugeColor, TimeSeriesVMs } from '@grafana/ui';
import { Gauge, Props } from './Gauge'; import { Gauge, Props } from './Gauge';
import { BasicGaugeColor } from '../types';
import { TimeSeriesVMs } from '@grafana/ui';
jest.mock('jquery', () => ({ jest.mock('jquery', () => ({
plot: jest.fn(), plot: jest.fn(),

View File

@ -1,7 +1,7 @@
import React, { PureComponent } from 'react'; import React, { PureComponent } from 'react';
import $ from 'jquery'; import $ from 'jquery';
import { BasicGaugeColor, MappingType, RangeMap, Threshold, ValueMap } from 'app/types'; import { BasicGaugeColor, Threshold, TimeSeriesVMs, RangeMap, ValueMap, MappingType } from '@grafana/ui';
import { TimeSeriesVMs } from '@grafana/ui';
import config from '../core/config'; import config from '../core/config';
import kbn from '../core/utils/kbn'; import kbn from '../core/utils/kbn';