Commit debb82e1 by Uchechukwu Obasi Committed by GitHub

BarGuage: updates story from knobs to controls (#31223)

* BarGuage: updated story from knobs to controls

* fixes type errors and disables unused controls

* update controls to support some BarGauge props

* changed addBarGaugeStory to component and removed closure

* cleaned up to be more readable

* more refactoring to be readable

* final touches...

* fixed disabled controls issue

* moved NOOP_CONTROL declaration to a seperate PR

* made some tweaks to the story names
parent 82933353
import React from 'react'; import React from 'react';
import { number, text } from '@storybook/addon-knobs'; import { Story } from '@storybook/react';
import { BarGauge, BarGaugeDisplayMode } from '@grafana/ui'; import { BarGauge, BarGaugeDisplayMode } from '@grafana/ui';
import { NOOP_CONTROL } from '@grafana/ui/.storybook/preview';
import { VizOrientation, ThresholdsMode, Field, FieldType, getDisplayProcessor } from '@grafana/data'; import { VizOrientation, ThresholdsMode, Field, FieldType, getDisplayProcessor } from '@grafana/data';
import { Props } from './BarGauge'; import { Props } from './BarGauge';
import { withCenteredStory } from '../../utils/storybook/withCenteredStory'; import { withCenteredStory } from '../../utils/storybook/withCenteredStory';
import mdx from './BarGauge.mdx'; import mdx from './BarGauge.mdx';
import { useTheme } from '../../themes'; import { useTheme } from '../../themes';
const getKnobs = () => {
return {
value: number('value', 70),
title: text('title', 'Title'),
minValue: number('minValue', 0),
maxValue: number('maxValue', 100),
threshold1Value: number('threshold1Value', 40),
threshold1Color: text('threshold1Color', 'orange'),
threshold2Value: number('threshold2Value', 60),
threshold2Color: text('threshold2Color', 'red'),
};
};
export default { export default {
title: 'Visualizations/BarGauge', title: 'Visualizations/BarGauge',
component: BarGauge, component: BarGauge,
...@@ -28,79 +16,109 @@ export default { ...@@ -28,79 +16,109 @@ export default {
docs: { docs: {
page: mdx, page: mdx,
}, },
knobs: {
disabled: true,
},
},
args: {
numeric: 70,
title: 'Title',
minValue: 0,
maxValue: 100,
threshold1Value: 40,
threshold1Color: 'orange',
threshold2Value: 60,
threshold2Color: 'red',
displayMode: BarGaugeDisplayMode.Gradient,
lcdCellWidth: 12,
itemSpacing: 8,
showUnfilled: true,
},
argTypes: {
displayMode: {
control: {
type: 'select',
options: [BarGaugeDisplayMode.Lcd, BarGaugeDisplayMode.Gradient, BarGaugeDisplayMode.Basic],
},
},
width: { control: { type: 'range', min: 200, max: 800 } },
height: { control: { type: 'range', min: 200, max: 800 } },
threshold1Color: { control: 'color' },
threshold2Color: { control: 'color' },
theme: NOOP_CONTROL,
field: NOOP_CONTROL,
value: NOOP_CONTROL,
display: NOOP_CONTROL,
orientation: NOOP_CONTROL,
text: NOOP_CONTROL,
onClick: NOOP_CONTROL,
className: NOOP_CONTROL,
alignmentFactors: NOOP_CONTROL,
}, },
}; };
function addBarGaugeStory(overrides: Partial<Props>) { interface StoryProps extends Partial<Props> {
return () => { numeric: number;
const theme = useTheme(); title: string;
minValue: number;
maxValue: number;
threshold1Color: string;
threshold2Color: string;
threshold1Value: number;
threshold2Value: number;
}
const { const AddBarGaugeStory = (storyProps: StoryProps) => {
value, const theme = useTheme();
title,
minValue,
maxValue,
threshold1Color,
threshold2Color,
threshold1Value,
threshold2Value,
} = getKnobs();
const field: Partial<Field> = { const field: Partial<Field> = {
type: FieldType.number, type: FieldType.number,
config: { config: {
min: minValue, min: storyProps.minValue,
max: maxValue, max: storyProps.maxValue,
thresholds: { thresholds: {
mode: ThresholdsMode.Absolute, mode: ThresholdsMode.Absolute,
steps: [ steps: [
{ value: -Infinity, color: 'green' }, { value: -Infinity, color: 'green' },
{ value: threshold1Value, color: threshold1Color }, { value: storyProps.threshold1Value, color: storyProps.threshold1Color },
{ value: threshold2Value, color: threshold2Color }, { value: storyProps.threshold2Value, color: storyProps.threshold2Color },
], ],
}, },
}, },
}; };
field.display = getDisplayProcessor({ field }); field.display = getDisplayProcessor({ field });
const props: Props = { const props: Partial<Props> = {
theme, theme,
width: 300, lcdCellWidth: storyProps.lcdCellWidth,
height: 300, itemSpacing: storyProps.itemSpacing,
showUnfilled: storyProps.showUnfilled,
width: storyProps.width,
height: storyProps.height,
value: { value: {
text: value.toString(), text: storyProps.numeric.toString(),
title: title, title: storyProps.title,
numeric: value, numeric: storyProps.numeric,
}, },
orientation: VizOrientation.Vertical, displayMode: storyProps.displayMode,
displayMode: BarGaugeDisplayMode.Basic, orientation: storyProps.orientation,
field: field.config!, field: field.config!,
display: field.display!, display: field.display!,
}; };
Object.assign(props, overrides);
return <BarGauge {...props} />; return <BarGauge {...props} />;
}; };
}
export const gradientVertical = addBarGaugeStory({ export const barGaugeVertical: Story<StoryProps> = AddBarGaugeStory.bind({});
displayMode: BarGaugeDisplayMode.Gradient, barGaugeVertical.args = {
orientation: VizOrientation.Vertical,
height: 500, height: 500,
width: 100, width: 100,
}); orientation: VizOrientation.Vertical,
};
export const gradientHorizontal = addBarGaugeStory({ export const barGaugeHorizontal: Story<StoryProps> = AddBarGaugeStory.bind({});
displayMode: BarGaugeDisplayMode.Gradient, barGaugeHorizontal.args = {
orientation: VizOrientation.Horizontal,
height: 100, height: 100,
width: 500, width: 500,
}); orientation: VizOrientation.Horizontal,
};
export const lcdHorizontal = addBarGaugeStory({
displayMode: BarGaugeDisplayMode.Lcd,
orientation: VizOrientation.Vertical,
height: 500,
width: 100,
});
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment