Chore: convert VariableOptions to use emotion instead of scss (#64135)

convert VariableOptions to use emotion instead of scss
This commit is contained in:
Ashley Harrison 2023-03-07 11:13:57 +00:00 committed by GitHub
parent 7211422850
commit 5b8c2f494d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 123 additions and 171 deletions

View File

@ -20,7 +20,7 @@ describe('Variables - Load options from Url', () => {
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown() e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown()
.should('be.visible') .should('be.visible')
.within(() => { .within(() => {
e2e().get('.variable-option').should('have.length', 9); e2e.components.Variables.variableOption().should('have.length', 9);
}); });
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('All').should('be.visible'); e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('All').should('be.visible');
@ -33,7 +33,7 @@ describe('Variables - Load options from Url', () => {
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown() e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown()
.should('be.visible') .should('be.visible')
.within(() => { .within(() => {
e2e().get('.variable-option').should('have.length', 9); e2e.components.Variables.variableOption().should('have.length', 9);
}); });
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('All').should('be.visible'); e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('All').should('be.visible');
@ -46,7 +46,7 @@ describe('Variables - Load options from Url', () => {
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown() e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown()
.should('be.visible') .should('be.visible')
.within(() => { .within(() => {
e2e().get('.variable-option').should('have.length', 9); e2e.components.Variables.variableOption().should('have.length', 9);
}); });
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('All').should('be.visible'); e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('All').should('be.visible');
@ -72,7 +72,7 @@ describe('Variables - Load options from Url', () => {
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown() e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown()
.should('be.visible') .should('be.visible')
.within(() => { .within(() => {
e2e().get('.variable-option').should('have.length', 9); e2e.components.Variables.variableOption().should('have.length', 9);
}); });
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('All').should('be.visible'); e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('All').should('be.visible');
@ -85,7 +85,7 @@ describe('Variables - Load options from Url', () => {
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown() e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown()
.should('be.visible') .should('be.visible')
.within(() => { .within(() => {
e2e().get('.variable-option').should('have.length', 9); e2e.components.Variables.variableOption().should('have.length', 9);
}); });
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('All').should('be.visible'); e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('All').should('be.visible');
@ -98,7 +98,7 @@ describe('Variables - Load options from Url', () => {
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown() e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown()
.should('be.visible') .should('be.visible')
.within(() => { .within(() => {
e2e().get('.variable-option').should('have.length', 9); e2e.components.Variables.variableOption().should('have.length', 9);
}); });
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('All').should('be.visible'); e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('All').should('be.visible');
@ -135,7 +135,7 @@ describe('Variables - Load options from Url', () => {
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown() e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown()
.should('be.visible') .should('be.visible')
.within(() => { .within(() => {
e2e().get('.variable-option').should('have.length', 9); e2e.components.Variables.variableOption().should('have.length', 9);
}); });
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('All').should('be.visible'); e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('All').should('be.visible');
@ -147,7 +147,7 @@ describe('Variables - Load options from Url', () => {
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown() e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown()
.should('be.visible') .should('be.visible')
.within(() => { .within(() => {
e2e().get('.variable-option').should('have.length', 65); e2e.components.Variables.variableOption().should('have.length', 65);
}); });
}); });
}); });

View File

@ -123,7 +123,7 @@ describe('Variables - Query - Add variable', () => {
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown() e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown()
.should('be.visible') .should('be.visible')
.within(() => { .within(() => {
e2e().get('.variable-option').should('have.length', 1); e2e.components.Variables.variableOption().should('have.length', 1);
}); });
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('C').should('be.visible'); e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('C').should('be.visible');
@ -195,7 +195,7 @@ describe('Variables - Query - Add variable', () => {
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown() e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown()
.should('be.visible') .should('be.visible')
.within(() => { .within(() => {
e2e().get('.variable-option').should('have.length', 2); e2e.components.Variables.variableOption().should('have.length', 2);
}); });
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('All').should('be.visible'); e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('All').should('be.visible');

View File

@ -33,7 +33,7 @@ describe('Variables - Set options from ui', () => {
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown() e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown()
.should('be.visible') .should('be.visible')
.within(() => { .within(() => {
e2e().get('.variable-option').should('have.length', 9); e2e.components.Variables.variableOption().should('have.length', 9);
}); });
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('All').should('be.visible'); e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('All').should('be.visible');
@ -46,7 +46,7 @@ describe('Variables - Set options from ui', () => {
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown() e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown()
.should('be.visible') .should('be.visible')
.within(() => { .within(() => {
e2e().get('.variable-option').should('have.length', 65); e2e.components.Variables.variableOption().should('have.length', 65);
}); });
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('All').should('be.visible'); e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('All').should('be.visible');
@ -89,7 +89,7 @@ describe('Variables - Set options from ui', () => {
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown() e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown()
.should('be.visible') .should('be.visible')
.within(() => { .within(() => {
e2e().get('.variable-option').should('have.length', 17); e2e.components.Variables.variableOption().should('have.length', 17);
}); });
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('All').should('be.visible'); e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('All').should('be.visible');
@ -105,7 +105,7 @@ describe('Variables - Set options from ui', () => {
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown() e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown()
.should('be.visible') .should('be.visible')
.within(() => { .within(() => {
e2e().get('.variable-option').should('have.length', 9); e2e.components.Variables.variableOption().should('have.length', 9);
}); });
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('All').should('be.visible'); e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('All').should('be.visible');
@ -147,7 +147,7 @@ describe('Variables - Set options from ui', () => {
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown() e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown()
.should('be.visible') .should('be.visible')
.within(() => { .within(() => {
e2e().get('.variable-option').should('have.length', 9); e2e.components.Variables.variableOption().should('have.length', 9);
}); });
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('All').should('be.visible'); e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('All').should('be.visible');
@ -160,7 +160,7 @@ describe('Variables - Set options from ui', () => {
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown() e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown()
.should('be.visible') .should('be.visible')
.within(() => { .within(() => {
e2e().get('.variable-option').should('have.length', 9); e2e.components.Variables.variableOption().should('have.length', 9);
}); });
e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('BBA').should('be.visible'); e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts('BBA').should('be.visible');

View File

@ -403,4 +403,7 @@ export const Components = {
AnalyticsToolbarButton: { AnalyticsToolbarButton: {
button: 'Dashboard insights', button: 'Dashboard insights',
}, },
Variables: {
variableOption: 'data-testid variable-option',
},
}; };

View File

@ -354,9 +354,6 @@ $diff-json-changed-num: $text-color;
$diff-json-icon: $gray-5; $diff-json-icon: $gray-5;
//Submenu
$variable-option-bg: $dropdownLinkBackgroundHover;
//Switch Slider //Switch Slider
// ------------------------- // -------------------------
$switch-bg: $input-bg; $switch-bg: $input-bg;

View File

@ -353,9 +353,6 @@ $diff-json-changed-num: $gray-4;
$diff-json-icon: $gray-4; $diff-json-icon: $gray-4;
//Submenu
$variable-option-bg: $dropdownLinkBackgroundHover;
//Switch Slider //Switch Slider
// ------------------------- // -------------------------
$switch-bg: $white; $switch-bg: $white;

View File

@ -1,9 +1,9 @@
import { css, cx } from '@emotion/css'; import { css, cx } from '@emotion/css';
import classNames from 'classnames';
import React, { PureComponent } from 'react'; import React, { PureComponent } from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { selectors } from '@grafana/e2e-selectors'; import { selectors } from '@grafana/e2e-selectors';
import { Tooltip, Themeable2, withTheme2, clearButtonStyles } from '@grafana/ui'; import { Tooltip, Themeable2, withTheme2, clearButtonStyles, stylesFactory } from '@grafana/ui';
import { Trans, t } from 'app/core/internationalization'; import { Trans, t } from 'app/core/internationalization';
import { ALL_VARIABLE_VALUE } from '../../constants'; import { ALL_VARIABLE_VALUE } from '../../constants';
@ -41,13 +41,14 @@ class VariableOptions extends PureComponent<Props> {
render() { render() {
// Don't want to pass faulty rest props to the div // Don't want to pass faulty rest props to the div
const { multi, values, highlightIndex, selectedValues, onToggle, onToggleAll, ...restProps } = this.props; const { multi, values, highlightIndex, selectedValues, onToggle, onToggleAll, theme, ...restProps } = this.props;
const styles = getStyles(theme);
return ( return (
<div className={`${multi ? 'variable-value-dropdown multi' : 'variable-value-dropdown single'}`}> <div className={styles.variableValueDropdown}>
<div className="variable-options-wrapper"> <div className={styles.variableOptionsWrapper}>
<ul <ul
className={listStyles} className={styles.variableOptionsColumn}
aria-label={selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown} aria-label={selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownDropDown}
{...restProps} {...restProps}
> >
@ -60,22 +61,34 @@ class VariableOptions extends PureComponent<Props> {
} }
renderOption(option: VariableOption, index: number) { renderOption(option: VariableOption, index: number) {
const { highlightIndex, theme } = this.props; const { highlightIndex, multi, theme } = this.props;
const selectClass = option.selected ? 'variable-option pointer selected' : 'variable-option pointer'; const styles = getStyles(theme);
const highlightClass = index === highlightIndex ? `${selectClass} highlighted` : selectClass;
const isAllOption = option.value === ALL_VARIABLE_VALUE; const isAllOption = option.value === ALL_VARIABLE_VALUE;
return ( return (
<li key={`${option.value}`}> <li key={`${option.value}`}>
<button <button
data-testid={selectors.components.Variables.variableOption}
role="checkbox" role="checkbox"
type="button" type="button"
aria-checked={option.selected} aria-checked={option.selected}
className={classNames(highlightClass, clearButtonStyles(theme), noStyledButton)} className={cx(
clearButtonStyles(theme),
styles.variableOption,
{
[styles.highlighted]: index === highlightIndex,
},
styles.noStyledButton
)}
onClick={this.onToggle(option)} onClick={this.onToggle(option)}
> >
<span className="variable-option-icon"></span> <span
className={cx(styles.variableOptionIcon, {
[styles.variableOptionIconSelected]: option.selected,
[styles.hideVariableOptionIcon]: !multi,
})}
></span>
<span data-testid={selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts(`${option.text}`)}> <span data-testid={selectors.pages.Dashboard.SubMenu.submenuItemValueDropDownOptionTexts(`${option.text}`)}>
{isAllOption ? t('variable.picker.option-all', 'All') : option.text} {isAllOption ? t('variable.picker.option-all', 'All') : option.text}
</span> </span>
@ -86,6 +99,7 @@ class VariableOptions extends PureComponent<Props> {
renderMultiToggle() { renderMultiToggle() {
const { multi, selectedValues, theme } = this.props; const { multi, selectedValues, theme } = this.props;
const styles = getStyles(theme);
if (!multi) { if (!multi) {
return null; return null;
@ -96,18 +110,23 @@ class VariableOptions extends PureComponent<Props> {
return ( return (
<Tooltip content={tooltipContent} placement={'top'}> <Tooltip content={tooltipContent} placement={'top'}>
<button <button
className={`${ className={cx(
selectedValues.length > 1 clearButtonStyles(theme),
? 'variable-options-column-header many-selected' styles.variableOption,
: 'variable-options-column-header' styles.variableOptionColumnHeader,
} ${noStyledButton} ${clearButtonStyles(theme)}`} styles.noStyledButton
)}
role="checkbox" role="checkbox"
aria-checked={selectedValues.length > 1 ? 'mixed' : 'false'} aria-checked={selectedValues.length > 1 ? 'mixed' : 'false'}
onClick={this.onToggleAll} onClick={this.onToggleAll}
aria-label="Toggle all values" aria-label="Toggle all values"
data-placement="top" data-placement="top"
> >
<span className="variable-option-icon"></span> <span
className={cx(styles.variableOptionIcon, {
[styles.variableOptionIconManySelected]: selectedValues.length > 1,
})}
></span>
<Trans i18nKey="variable.picker.option-selected-values">Selected</Trans> ({selectedValues.length}) <Trans i18nKey="variable.picker.option-selected-values">Selected</Trans> ({selectedValues.length})
</button> </button>
</Tooltip> </Tooltip>
@ -115,16 +134,74 @@ class VariableOptions extends PureComponent<Props> {
} }
} }
const listStyles = cx( const getStyles = stylesFactory((theme: GrafanaTheme2) => {
'variable-options-column', const checkboxImageUrl = theme.isDark ? 'public/img/checkbox.png' : 'public/img/checkbox_white.png';
css`
list-style-type: none;
`
);
const noStyledButton = css` return {
width: 100%; hideVariableOptionIcon: css({
text-align: left; display: 'none',
`; }),
highlighted: css({
backgroundColor: theme.colors.action.hover,
}),
noStyledButton: css({
width: '100%',
textAlign: 'left',
}),
variableOption: css({
display: 'block',
padding: '2px 27px 0 8px',
position: 'relative',
whiteSpace: 'nowrap',
minWidth: '115px',
['&:hover']: {
backgroundColor: theme.colors.action.hover,
},
}),
variableOptionColumnHeader: css({
paddingTop: '5px',
paddingBottom: '5px',
marginBottom: '5px',
}),
variableOptionIcon: css({
display: 'inline-block',
width: '24px',
height: '18px',
position: 'relative',
top: '4px',
background: `url(${checkboxImageUrl}) left top no-repeat`,
}),
variableOptionIconManySelected: css({
background: `url(${checkboxImageUrl}) 0px -36px no-repeat`,
}),
variableOptionIconSelected: css({
background: `url(${checkboxImageUrl}) 0px -18px no-repeat`,
}),
variableValueDropdown: css({
backgroundColor: theme.colors.background.primary,
border: `1px solid ${theme.colors.border.weak}`,
borderRadius: theme.shape.borderRadius(2),
boxShadow: theme.shadows.z2,
position: 'absolute',
top: theme.spacing(theme.components.height.md),
maxHeight: '400px',
minHeight: '150px',
minWidth: '150px',
overflowY: 'auto',
overflowX: 'hidden',
zIndex: theme.zIndex.typeahead,
}),
variableOptionsColumn: css({
maxHeight: '350px',
display: 'table-cell',
lineHeight: '26px',
listStyleType: 'none',
}),
variableOptionsWrapper: css({
display: 'table',
width: '100%',
}),
};
});
export default withTheme2(VariableOptions); export default withTheme2(VariableOptions);

View File

@ -356,9 +356,6 @@ $diff-json-changed-num: $text-color;
$diff-json-icon: $gray-5; $diff-json-icon: $gray-5;
//Submenu
$variable-option-bg: $dropdownLinkBackgroundHover;
//Switch Slider //Switch Slider
// ------------------------- // -------------------------
$switch-bg: $input-bg; $switch-bg: $input-bg;

View File

@ -353,9 +353,6 @@ $diff-json-changed-num: $gray-4;
$diff-json-icon: $gray-4; $diff-json-icon: $gray-4;
//Submenu
$variable-option-bg: $dropdownLinkBackgroundHover;
//Switch Slider //Switch Slider
// ------------------------- // -------------------------
$switch-bg: $white; $switch-bg: $white;

View File

@ -8,15 +8,6 @@
padding: 0 0 $space-sm 0; padding: 0 0 $space-sm 0;
} }
.annotation-segment {
padding: 8px 7px;
label.cr1 {
margin-left: 5px;
margin-top: 3px;
}
}
.submenu-item { .submenu-item {
display: inline-block; display: inline-block;
@ -30,114 +21,7 @@
} }
} }
.variable-value-link {
max-width: 500px;
padding-right: 10px;
padding: 0 $space-sm;
background-color: $input-bg;
border: 1px solid $input-border-color;
border-radius: $input-border-radius;
display: flex;
align-items: center;
color: $text-color;
height: $input-height;
.label-tag {
margin: 0 5px;
}
}
.variable-link-wrapper { .variable-link-wrapper {
display: inline-block; display: inline-block;
position: relative; position: relative;
} }
.variable-value-dropdown {
position: absolute;
top: $input-height;
min-width: 150px;
max-height: 400px;
min-height: 150px;
overflow-y: auto;
overflow-x: hidden;
background-color: $dropdownBackground;
box-shadow: $dropdownShadow;
z-index: $zindex-typeahead;
font-size: $font-size-base;
border-radius: 3px 3px 0 0;
border: 1px solid $tight-form-func-bg;
&.multi {
.selected {
.variable-option-icon {
background: url($checkboxImageUrl) 0px -18px no-repeat;
}
}
}
&.single {
.variable-option-icon {
display: none;
}
.selected {
background-color: $tight-form-func-highlight-bg;
}
}
}
.variable-options-wrapper {
display: table;
width: 100%;
}
.variable-options-column {
max-height: 350px;
display: table-cell;
line-height: 26px;
&:nth-child(2) {
border-left: 1px solid $tight-form-func-bg;
}
}
.variable-option-tag,
.variable-option,
.variable-options-column-header {
display: block;
padding: 2px 27px 0 8px;
position: relative;
white-space: nowrap;
min-width: 115px;
}
.variable-options-column-header {
padding-top: 5px;
padding-bottom: 5px;
margin-bottom: 5px;
&.many-selected {
.variable-option-icon {
background: url($checkboxImageUrl) 0px -36px no-repeat;
}
}
}
.variable-option-icon {
display: inline-block;
width: 24px;
height: 18px;
position: relative;
top: 4px;
background: url($checkboxImageUrl) left top no-repeat;
}
.variable-option {
&:hover,
&.highlighted {
background-color: $variable-option-bg;
}
}
.dash-nav-link {
padding: 8px 7px;
display: inline-block;
color: $text-color;
}