diff --git a/packages/grafana-ui/src/components/TableReducePicker/TableReducePicker.story.tsx b/packages/grafana-ui/src/components/TableReducePicker/TableReducePicker.story.tsx new file mode 100644 index 00000000000..596b7fd444a --- /dev/null +++ b/packages/grafana-ui/src/components/TableReducePicker/TableReducePicker.story.tsx @@ -0,0 +1,42 @@ +import React, { PureComponent } from 'react'; + +import { storiesOf } from '@storybook/react'; +import { action } from '@storybook/addon-actions'; +import { withCenteredStory } from '../../utils/storybook/withCenteredStory'; +import { TableReducePicker } from './TableReducePicker'; + +interface State { + reducers: string[]; +} + +export class WrapperWithState extends PureComponent { + constructor(props: any) { + super(props); + this.state = { + reducers: [], // nothing? + }; + } + + render() { + return ( + { + action('Reduce')(reducers); + this.setState({ reducers }); + }} + /> + ); + } +} + +const story = storiesOf('UI/TableReducePicker', module); +story.addDecorator(withCenteredStory); +story.add('default', () => { + return ( +
+ +
+ ); +}); diff --git a/packages/grafana-ui/src/components/TableReducePicker/TableReducePicker.tsx b/packages/grafana-ui/src/components/TableReducePicker/TableReducePicker.tsx new file mode 100644 index 00000000000..d200658babb --- /dev/null +++ b/packages/grafana-ui/src/components/TableReducePicker/TableReducePicker.tsx @@ -0,0 +1,57 @@ +import React, { PureComponent } from 'react'; + +import isArray from 'lodash/isArray'; + +import { Select } from '../index'; + +import { getTableReducers } from '../../utils/tableReducer'; +import { SelectOptionItem } from '../Select/Select'; + +interface Props { + onChange: (reducers: string[]) => void; + reducers: string[]; + width?: number; +} + +export class TableReducePicker extends PureComponent { + static defaultProps = { + width: 12, + }; + + onSelectionChange = (item: SelectOptionItem) => { + const { onChange } = this.props; + if (isArray(item)) { + onChange(item.map(v => v.value)); + } else { + onChange([item.value]); + } + }; + + render() { + const { width, reducers } = this.props; + + const allReducers = getTableReducers(); + + // Need to transform the data structure to work well with Select + const reducerOptions = allReducers.map(info => { + return { + label: info.name, + value: info.key, + description: info.description, + }; + }); + + const current = reducerOptions.filter(options => reducers.includes(options.value)); + return ( +