diff --git a/e2e/suite1/specs/explore.spec.ts b/e2e/suite1/specs/explore.spec.ts index b96f9b4b6c6..7b4765a36f9 100644 --- a/e2e/suite1/specs/explore.spec.ts +++ b/e2e/suite1/specs/explore.spec.ts @@ -9,7 +9,7 @@ e2e.scenario({ scenario: () => { e2e.pages.Explore.visit(); e2e.pages.Explore.General.container().should('have.length', 1); - e2e.pages.Explore.General.runButton().should('have.length', 1); + e2e.components.RefreshPicker.runButton().should('have.length', 1); e2e.components.DataSource.TestData.QueryTab.scenarioSelectContainer() .should('be.visible') diff --git a/packages/grafana-e2e-selectors/src/selectors/components.ts b/packages/grafana-e2e-selectors/src/selectors/components.ts index 7b99a4756de..a25d1164a4f 100644 --- a/packages/grafana-e2e-selectors/src/selectors/components.ts +++ b/packages/grafana-e2e-selectors/src/selectors/components.ts @@ -89,6 +89,9 @@ export const Components = { title: (title: string) => `Tab ${title}`, active: () => '[class*="-activeTabStyle"]', }, + RefreshPicker: { + runButton: 'RefreshPicker run button', + }, QueryTab: { content: 'Query editor tab content', queryInspectorButton: 'Query inspector button', diff --git a/packages/grafana-e2e-selectors/src/selectors/pages.ts b/packages/grafana-e2e-selectors/src/selectors/pages.ts index 1a238aff590..88cbb7edc2a 100644 --- a/packages/grafana-e2e-selectors/src/selectors/pages.ts +++ b/packages/grafana-e2e-selectors/src/selectors/pages.ts @@ -129,7 +129,6 @@ export const Pages = { General: { container: 'Explore', graph: 'Explore Graph', - runButton: 'Run button', table: 'Explore Table', }, Toolbar: { diff --git a/packages/grafana-ui/src/components/Button/Button.tsx b/packages/grafana-ui/src/components/Button/Button.tsx index ef6aa464d95..d0e27fe7626 100644 --- a/packages/grafana-ui/src/components/Button/Button.tsx +++ b/packages/grafana-ui/src/components/Button/Button.tsx @@ -171,7 +171,7 @@ function getButtonVariantStyles(from: string, to: string, textColor: string, the `; } -function getPropertiesForVariant(theme: GrafanaTheme, variant: ButtonVariant) { +export function getPropertiesForVariant(theme: GrafanaTheme, variant: ButtonVariant) { switch (variant) { case 'secondary': const from = theme.isLight ? theme.palette.gray7 : theme.palette.gray15; diff --git a/packages/grafana-ui/src/components/Button/ButtonGroup.tsx b/packages/grafana-ui/src/components/Button/ButtonGroup.tsx index 2eee3a67f00..11d022f8efa 100644 --- a/packages/grafana-ui/src/components/Button/ButtonGroup.tsx +++ b/packages/grafana-ui/src/components/Button/ButtonGroup.tsx @@ -1,18 +1,25 @@ import React, { forwardRef, HTMLAttributes } from 'react'; -import { css } from 'emotion'; +import { css, cx } from 'emotion'; import { GrafanaTheme } from '@grafana/data'; import { useStyles } from '../../themes'; export interface Props extends HTMLAttributes { + className?: string; noSpacing?: boolean; } -export const ButtonGroup = forwardRef(({ noSpacing, children, ...rest }, ref) => { +export const ButtonGroup = forwardRef(({ noSpacing, className, children, ...rest }, ref) => { const styles = useStyles(getStyles); - const className = noSpacing ? styles.wrapperNoSpacing : styles.wrapper; + const mainClass = cx( + { + [styles.wrapper]: !noSpacing, + [styles.wrapperNoSpacing]: noSpacing, + }, + className + ); return ( -
+
{children}
); @@ -41,7 +48,7 @@ const getStyles = (theme: GrafanaTheme) => ({ border-radius: 0; border-right: 0; - &:last-child { + &:last-of-type { border-radius: 0 ${theme.border.radius.sm} ${theme.border.radius.sm} 0; border-right: 1px solid ${theme.colors.border2}; } diff --git a/packages/grafana-ui/src/components/Button/ToolbarButton.story.tsx b/packages/grafana-ui/src/components/Button/ToolbarButton.story.tsx index 498cbddc988..66d717df2ff 100644 --- a/packages/grafana-ui/src/components/Button/ToolbarButton.story.tsx +++ b/packages/grafana-ui/src/components/Button/ToolbarButton.story.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { ToolbarButton, ButtonGroup, useTheme, VerticalGroup } from '@grafana/ui'; +import { ToolbarButton, ButtonGroup, useTheme, VerticalGroup, HorizontalGroup } from '@grafana/ui'; import { withCenteredStory } from '../../utils/storybook/withCenteredStory'; export default { @@ -41,6 +41,22 @@ export const List = () => { +
+ As primary and destructive variant + + + + Run query + + + + + + Run query + + + +
); diff --git a/packages/grafana-ui/src/components/Button/ToolbarButton.tsx b/packages/grafana-ui/src/components/Button/ToolbarButton.tsx index b5a6284ce44..ed205e8071f 100644 --- a/packages/grafana-ui/src/components/Button/ToolbarButton.tsx +++ b/packages/grafana-ui/src/components/Button/ToolbarButton.tsx @@ -5,6 +5,7 @@ import { styleMixins, useStyles } from '../../themes'; import { IconName } from '../../types/icon'; import { Tooltip } from '../Tooltip/Tooltip'; import { Icon } from '../Icon/Icon'; +import { ButtonVariant, getPropertiesForVariant } from './Button'; export interface Props extends HTMLAttributes { /** Icon name */ @@ -19,27 +20,31 @@ export interface Props extends HTMLAttributes { fullWidth?: boolean; /** reduces padding to xs */ narrow?: boolean; + /** variant */ + variant?: ButtonVariant; } export const ToolbarButton = forwardRef( - ({ tooltip, icon, className, children, imgSrc, fullWidth, isOpen, narrow, ...rest }, ref) => { + ({ tooltip, icon, className, children, imgSrc, fullWidth, isOpen, narrow, variant, ...rest }, ref) => { const styles = useStyles(getStyles); - const contentStyles = cx({ - [styles.content]: true, - [styles.contentWithIcon]: !!icon, - [styles.contentWithRightIcon]: isOpen !== undefined, - }); - const buttonStyles = cx( { [styles.button]: true, [styles.buttonFullWidth]: fullWidth, [styles.narrow]: narrow, + [styles.primaryVariant]: variant === 'primary', + [styles.destructiveVariant]: variant === 'destructive', }, className ); + const contentStyles = cx({ + [styles.content]: true, + [styles.contentWithIcon]: !!icon, + [styles.contentWithRightIcon]: isOpen !== undefined, + }); + const body = (