diff --git a/packages/grafana-ui/src/components/Button/ToolbarButton.story.tsx b/packages/grafana-ui/src/components/Button/ToolbarButton.story.tsx deleted file mode 100644 index f152001023c..00000000000 --- a/packages/grafana-ui/src/components/Button/ToolbarButton.story.tsx +++ /dev/null @@ -1,100 +0,0 @@ -import React from 'react'; - -import { ToolbarButton, ButtonGroup, VerticalGroup, HorizontalGroup } from '@grafana/ui'; - -import { DashboardStoryCanvas } from '../../utils/storybook/DashboardStoryCanvas'; -import { withCenteredStory } from '../../utils/storybook/withCenteredStory'; - -import { ToolbarButtonVariant } from './ToolbarButton'; -import { ToolbarButtonRow } from './ToolbarButtonRow'; - -export default { - title: 'Buttons/ToolbarButton', - component: ToolbarButton, - decorators: [withCenteredStory], - parameters: {}, -}; - -export const List = () => { - const variants: ToolbarButtonVariant[] = ['default', 'active', 'primary', 'destructive']; - - return ( - - - Button states - - Just text - - With imgSrc - - isOpen - - - isOpen = false - - -
- disabled - - - Disabled - - -
- Variants - - {variants.map((variant) => ( - - {variant} - - ))} - -
- disabled - - - Disabled - - -
- Variants - - {variants.map((variant) => ( - - {variant} - - ))} - -
- Wrapped in noSpacing ButtonGroup - - - 2020-10-02 - - - -
- - - - -
- As primary and destructive variant - - - - Run query - - - - - - Run query - - - - -
-
- ); -}; diff --git a/packages/grafana-ui/src/components/Button/index.ts b/packages/grafana-ui/src/components/Button/index.ts index cc6da63a2d4..3e27c288a5d 100644 --- a/packages/grafana-ui/src/components/Button/index.ts +++ b/packages/grafana-ui/src/components/Button/index.ts @@ -1,4 +1,2 @@ export * from './Button'; export { ButtonGroup } from './ButtonGroup'; -export { ToolbarButton, ToolbarButtonVariant } from './ToolbarButton'; -export { ToolbarButtonRow } from './ToolbarButtonRow'; diff --git a/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker.tsx b/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker.tsx index 375650c9fa3..b4985badef9 100644 --- a/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker.tsx +++ b/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker.tsx @@ -19,7 +19,8 @@ import { selectors } from '@grafana/e2e-selectors'; import { withTheme, useTheme } from '../../themes/ThemeContext'; import { stylesFactory } from '../../themes/stylesFactory'; import { Themeable } from '../../types'; -import { ButtonGroup, ToolbarButton } from '../Button'; +import { ButtonGroup } from '../Button'; +import { ToolbarButton } from '../ToolbarButton'; import { Tooltip } from '../Tooltip/Tooltip'; import { TimePickerContent } from './TimeRangePicker/TimePickerContent'; diff --git a/packages/grafana-ui/src/components/Dropdown/ButtonSelect.tsx b/packages/grafana-ui/src/components/Dropdown/ButtonSelect.tsx index be0ae91df41..d16d590b01b 100644 --- a/packages/grafana-ui/src/components/Dropdown/ButtonSelect.tsx +++ b/packages/grafana-ui/src/components/Dropdown/ButtonSelect.tsx @@ -8,10 +8,11 @@ import React, { HTMLAttributes } from 'react'; import { GrafanaTheme2, SelectableValue } from '@grafana/data'; import { useStyles2 } from '../../themes/ThemeContext'; -import { ToolbarButtonVariant, ToolbarButton, ButtonGroup } from '../Button'; +import { ButtonGroup } from '../Button'; import { ClickOutsideWrapper } from '../ClickOutsideWrapper/ClickOutsideWrapper'; import { Menu } from '../Menu/Menu'; import { MenuItem } from '../Menu/MenuItem'; +import { ToolbarButton, ToolbarButtonVariant } from '../ToolbarButton'; import { PopoverContent } from '../Tooltip'; export interface Props extends HTMLAttributes { diff --git a/packages/grafana-ui/src/components/RefreshPicker/RefreshPicker.tsx b/packages/grafana-ui/src/components/RefreshPicker/RefreshPicker.tsx index 2e437b0076b..f9c07499104 100644 --- a/packages/grafana-ui/src/components/RefreshPicker/RefreshPicker.tsx +++ b/packages/grafana-ui/src/components/RefreshPicker/RefreshPicker.tsx @@ -4,8 +4,9 @@ import React, { PureComponent } from 'react'; import { SelectableValue, parseDuration } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; -import { ButtonGroup, ToolbarButton, ToolbarButtonVariant } from '../Button'; +import { ButtonGroup } from '../Button'; import { ButtonSelect } from '../Dropdown/ButtonSelect'; +import { ToolbarButtonVariant, ToolbarButton } from '../ToolbarButton'; // Default intervals used in the refresh picker component export const defaultIntervals = ['5s', '10s', '30s', '1m', '5m', '15m', '30m', '1h', '2h', '1d']; diff --git a/packages/grafana-ui/src/components/ToolbarButton/ToolbarButton.mdx b/packages/grafana-ui/src/components/ToolbarButton/ToolbarButton.mdx new file mode 100644 index 00000000000..506e00bc487 --- /dev/null +++ b/packages/grafana-ui/src/components/ToolbarButton/ToolbarButton.mdx @@ -0,0 +1,26 @@ +import { Meta, Props } from '@storybook/addon-docs/blocks'; +import { ToolbarButton } from './ToolbarButton'; + +# ToolbarButton + +Multiple buttons that form a toolbar. Each button can contain an icon, image and text. +There are three variants of the `ToolbarButton`: default, primary and destructive. + +## Usage + +This example shows how to use several buttons in a `ToolbarButtonRow`. + +```jsx + + + Last 6 hours + + + + + + + +``` + + diff --git a/packages/grafana-ui/src/components/ToolbarButton/ToolbarButton.story.tsx b/packages/grafana-ui/src/components/ToolbarButton/ToolbarButton.story.tsx new file mode 100644 index 00000000000..ae1f17a488f --- /dev/null +++ b/packages/grafana-ui/src/components/ToolbarButton/ToolbarButton.story.tsx @@ -0,0 +1,103 @@ +import { Meta, Story } from '@storybook/react'; +import React from 'react'; + +import { withCenteredStory } from '../../utils/storybook/withCenteredStory'; +import { ButtonGroup } from '../Button'; + +import { ToolbarButton, ToolbarButtonProps } from './ToolbarButton'; +import mdx from './ToolbarButton.mdx'; +import { ToolbarButtonRow } from './ToolbarButtonRow'; + +export default { + title: 'Buttons/ToolbarButton', + component: ToolbarButton, + decorators: [withCenteredStory], + parameters: { + docs: { + page: mdx, + }, + controls: { + exclude: ['imgSrc', 'imgAlt', 'iconOnly', 'narrow'], + }, + }, + args: { + variant: 'default', + fullWidth: false, + disabled: false, + toolbarButtonText: 'Just text', + icon: 'cloud', + showDropdown: false, + isOpen: false, + tooltip: 'This is a tooltip', + isHighlighted: false, + imgSrc: '', + imgAlt: '', + }, + argTypes: { + variant: { + control: { + type: 'select', + }, + options: ['default', 'primary', 'active', 'destructive'], + }, + icon: { + control: { + type: 'select', + options: ['sync', 'cloud'], + }, + }, + }, +} as Meta; + +interface StoryProps extends Partial { + toolbarButtonText: string; + showDropdown: boolean; +} + +export const BasicWithText: Story = (args) => { + return ( + + {args.toolbarButtonText} + + ); +}; + +export const BasicWithIcon: Story = (args) => { + return ( + + ); +}; + +export const List: Story = (args) => { + return ( + + + Last 6 hours + + + + + + + + ); +}; diff --git a/packages/grafana-ui/src/components/Button/ToolbarButton.tsx b/packages/grafana-ui/src/components/ToolbarButton/ToolbarButton.tsx similarity index 96% rename from packages/grafana-ui/src/components/Button/ToolbarButton.tsx rename to packages/grafana-ui/src/components/ToolbarButton/ToolbarButton.tsx index 739c27e3fdf..1a6e9f5b672 100644 --- a/packages/grafana-ui/src/components/Button/ToolbarButton.tsx +++ b/packages/grafana-ui/src/components/ToolbarButton/ToolbarButton.tsx @@ -8,12 +8,11 @@ import { selectors } from '@grafana/e2e-selectors'; import { styleMixins, useStyles2 } from '../../themes'; import { getFocusStyles, getMouseFocusStyles } from '../../themes/mixins'; import { IconName } from '../../types/icon'; +import { getPropertiesForVariant } from '../Button'; import { Icon } from '../Icon/Icon'; import { Tooltip } from '../Tooltip/Tooltip'; -import { getPropertiesForVariant } from './Button'; - -export interface Props extends ButtonHTMLAttributes { +type CommonProps = { /** Icon name */ icon?: IconName | React.ReactNode; /** Tooltip */ @@ -34,11 +33,13 @@ export interface Props extends ButtonHTMLAttributes { iconOnly?: boolean; /** Show highlight dot */ isHighlighted?: boolean; -} +}; + +export type ToolbarButtonProps = CommonProps & ButtonHTMLAttributes; export type ToolbarButtonVariant = 'default' | 'primary' | 'destructive' | 'active'; -export const ToolbarButton = forwardRef( +export const ToolbarButton = forwardRef( ( { tooltip, diff --git a/packages/grafana-ui/src/components/Button/ToolbarButtonRow.tsx b/packages/grafana-ui/src/components/ToolbarButton/ToolbarButtonRow.tsx similarity index 100% rename from packages/grafana-ui/src/components/Button/ToolbarButtonRow.tsx rename to packages/grafana-ui/src/components/ToolbarButton/ToolbarButtonRow.tsx diff --git a/packages/grafana-ui/src/components/ToolbarButton/index.ts b/packages/grafana-ui/src/components/ToolbarButton/index.ts new file mode 100644 index 00000000000..f6a0851d6b9 --- /dev/null +++ b/packages/grafana-ui/src/components/ToolbarButton/index.ts @@ -0,0 +1,2 @@ +export * from './ToolbarButton'; +export { ToolbarButtonRow } from './ToolbarButtonRow'; diff --git a/packages/grafana-ui/src/components/index.ts b/packages/grafana-ui/src/components/index.ts index 802e5e62267..721d749c863 100644 --- a/packages/grafana-ui/src/components/index.ts +++ b/packages/grafana-ui/src/components/index.ts @@ -178,7 +178,8 @@ export { RangeSlider } from './Slider/RangeSlider'; export { Form } from './Forms/Form'; export { sharedInputStyle } from './Forms/commonStyles'; export { InputControl } from './InputControl'; -export { Button, LinkButton, ButtonVariant, ToolbarButton, ButtonGroup, ToolbarButtonRow, ButtonProps } from './Button'; +export { Button, LinkButton, ButtonVariant, ButtonGroup, ButtonProps } from './Button'; +export { ToolbarButton, ToolbarButtonRow } from './ToolbarButton'; export { ValuePicker } from './ValuePicker/ValuePicker'; export { fieldMatchersUI } from './MatchersUI/fieldMatchersUI'; export { Link } from './Link/Link';