chore: Replaces Icon with Icons component - iteration 1 (#14469)

This commit is contained in:
Michael S. Molina 2021-05-17 14:24:56 -03:00 committed by GitHub
parent 4e6169e0f9
commit 9deb7aa3c1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 79 additions and 86 deletions

View File

@ -22,7 +22,7 @@ import { t } from '@superset-ui/core';
import Popover from 'src/components/Popover'; import Popover from 'src/components/Popover';
import { FormLabel } from 'src/components/Form'; import { FormLabel } from 'src/components/Form';
import Icon from 'src/components/Icon'; import Icons from 'src/components/Icons';
import { Tooltip } from 'src/components/Tooltip'; import { Tooltip } from 'src/components/Tooltip';
import CopyToClipboard from 'src/components/CopyToClipboard'; import CopyToClipboard from 'src/components/CopyToClipboard';
import { getShortUrl } from 'src/utils/urlUtils'; import { getShortUrl } from 'src/utils/urlUtils';
@ -161,9 +161,9 @@ export default class EmbedCodeButton extends React.Component {
<div <div
className="btn btn-default btn-sm" className="btn btn-default btn-sm"
data-test="embed-code-button" data-test="embed-code-button"
style={{ height: 30 }} style={{ display: 'flex', alignItems: 'center', height: 30 }}
> >
<Icon name="code" width={15} height={15} style={{ marginTop: 1 }} /> <Icons.Code iconSize="l" />
</div> </div>
</Tooltip> </Tooltip>
</Popover> </Popover>

View File

@ -19,7 +19,7 @@
import React, { useState } from 'react'; import React, { useState } from 'react';
import cx from 'classnames'; import cx from 'classnames';
import { t } from '@superset-ui/core'; import { t } from '@superset-ui/core';
import Icon from 'src/components/Icon'; import Icons from 'src/components/Icons';
import { Tooltip } from 'src/components/Tooltip'; import { Tooltip } from 'src/components/Tooltip';
import copyTextToClipboard from 'src/utils/copy'; import copyTextToClipboard from 'src/utils/copy';
import withToasts from 'src/messageToasts/enhancers/withToasts'; import withToasts from 'src/messageToasts/enhancers/withToasts';
@ -68,7 +68,11 @@ const ActionButton = (props: ActionButtonProps) => {
<div <div
role="button" role="button"
tabIndex={0} tabIndex={0}
css={{ '&:focus, &:focus:active': { outline: 0 } }} css={{
display: 'flex',
alignItems: 'center',
'&:focus, &:focus:active': { outline: 0 },
}}
className={className || 'btn btn-default btn-sm'} className={className || 'btn btn-default btn-sm'}
style={{ height: 30 }} style={{ height: 30 }}
{...rest} {...rest}
@ -145,14 +149,7 @@ const ExploreActionButtons = (props: ExploreActionButtonsProps) => {
{latestQueryFormData && ( {latestQueryFormData && (
<> <>
<ActionButton <ActionButton
icon={ icon={<Icons.Link iconSize="l" />}
<Icon
name="link"
width={15}
height={15}
style={{ marginTop: 1 }}
/>
}
tooltip={copyTooltip} tooltip={copyTooltip}
onClick={doCopyLink} onClick={doCopyLink}
data-test="short-link-button" data-test="short-link-button"
@ -161,26 +158,19 @@ const ExploreActionButtons = (props: ExploreActionButtonsProps) => {
} }
/> />
<ActionButton <ActionButton
icon={ icon={<Icons.Email iconSize="l" />}
<Icon
name="email"
width={15}
height={15}
style={{ marginTop: 1 }}
/>
}
tooltip={t('Share chart by email')} tooltip={t('Share chart by email')}
onClick={doShareEmail} onClick={doShareEmail}
/> />
<EmbedCodeButton latestQueryFormData={latestQueryFormData} /> <EmbedCodeButton latestQueryFormData={latestQueryFormData} />
<ActionButton <ActionButton
icon={<i className="fa fa-file-code-o" />} icon={<Icons.FileTextOutlined iconSize="m" />}
text=".JSON" text=".JSON"
tooltip={t('Export to .JSON format')} tooltip={t('Export to .JSON format')}
onClick={doExportJson} onClick={doExportJson}
/> />
<ActionButton <ActionButton
icon={<i className="fa fa-file-text-o" />} icon={<Icons.FileExcelOutlined iconSize="m" />}
text=".CSV" text=".CSV"
tooltip={t('Export to .CSV format')} tooltip={t('Export to .CSV format')}
onClick={doExportCSV} onClick={doExportCSV}

View File

@ -21,7 +21,7 @@ import React, { useEffect, useMemo, useState } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { bindActionCreators } from 'redux'; import { bindActionCreators } from 'redux';
import { connect } from 'react-redux'; import { connect } from 'react-redux';
import { styled, t, supersetTheme, css } from '@superset-ui/core'; import { styled, t, css, useTheme } from '@superset-ui/core';
import { debounce } from 'lodash'; import { debounce } from 'lodash';
import { Resizable } from 're-resizable'; import { Resizable } from 're-resizable';
@ -29,7 +29,7 @@ import { useDynamicPluginContext } from 'src/components/DynamicPlugins';
import { Global } from '@emotion/react'; import { Global } from '@emotion/react';
import { Tooltip } from 'src/components/Tooltip'; import { Tooltip } from 'src/components/Tooltip';
import { usePrevious } from 'src/common/hooks/usePrevious'; import { usePrevious } from 'src/common/hooks/usePrevious';
import Icon from 'src/components/Icon'; import Icons from 'src/components/Icons';
import { import {
getFromLocalStorage, getFromLocalStorage,
setInLocalStorage, setInLocalStorage,
@ -170,6 +170,7 @@ function ExploreViewContainer(props) {
const [showingModal, setShowingModal] = useState(false); const [showingModal, setShowingModal] = useState(false);
const [isCollapsed, setIsCollapsed] = useState(false); const [isCollapsed, setIsCollapsed] = useState(false);
const theme = useTheme();
const width = `${windowSize.width}px`; const width = `${windowSize.width}px`;
const navHeight = props.standalone ? 0 : 90; const navHeight = props.standalone ? 0 : 90;
const height = props.forcedHeight const height = props.forcedHeight
@ -472,11 +473,10 @@ function ExploreViewContainer(props) {
className="action-button" className="action-button"
onClick={toggleCollapse} onClick={toggleCollapse}
> >
<Icon <Icons.Expand
name="expand"
color={supersetTheme.colors.primary.base}
className="collapse-icon" className="collapse-icon"
width={16} iconColor={theme.colors.primary.base}
iconSize="l"
/> />
</span> </span>
</div> </div>
@ -496,15 +496,18 @@ function ExploreViewContainer(props) {
> >
<span role="button" tabIndex={0} className="action-button"> <span role="button" tabIndex={0} className="action-button">
<Tooltip title={t('Open Datasource tab')}> <Tooltip title={t('Open Datasource tab')}>
<Icon <Icons.Collapse
name="collapse"
color={supersetTheme.colors.primary.base}
className="collapse-icon" className="collapse-icon"
width={16} iconColor={theme.colors.primary.base}
iconSize="l"
/> />
</Tooltip> </Tooltip>
</span> </span>
<Icon name="dataset-physical" width={16} /> <Icons.DatasetPhysical
css={{ marginTop: theme.gridUnit * 2 }}
iconSize="l"
iconColor={theme.colors.grayscale.base}
/>
</div> </div>
) : null} ) : null}
<Resizable <Resizable

View File

@ -31,25 +31,25 @@ const defaultProps = {
options: { string: { column_name: 'Column' } }, options: { string: { column_name: 'Column' } },
}; };
test('renders with default props', () => { test('renders with default props', async () => {
render(<DndSelectLabel {...defaultProps} />, { useDnd: true }); render(<DndSelectLabel {...defaultProps} />, { useDnd: true });
expect(screen.getByText('Drop columns')).toBeInTheDocument(); expect(await screen.findByText('Drop columns')).toBeInTheDocument();
}); });
test('renders ghost button when empty', () => { test('renders ghost button when empty', async () => {
const ghostButtonText = 'Ghost button text'; const ghostButtonText = 'Ghost button text';
render( render(
<DndSelectLabel {...defaultProps} ghostButtonText={ghostButtonText} />, <DndSelectLabel {...defaultProps} ghostButtonText={ghostButtonText} />,
{ useDnd: true }, { useDnd: true },
); );
expect(screen.getByText(ghostButtonText)).toBeInTheDocument(); expect(await screen.findByText(ghostButtonText)).toBeInTheDocument();
}); });
test('renders values', () => { test('renders values', async () => {
const values = 'Values'; const values = 'Values';
const valuesRenderer = () => <span>{values}</span>; const valuesRenderer = () => <span>{values}</span>;
render(<DndSelectLabel {...defaultProps} valuesRenderer={valuesRenderer} />, { render(<DndSelectLabel {...defaultProps} valuesRenderer={valuesRenderer} />, {
useDnd: true, useDnd: true,
}); });
expect(screen.getByText(values)).toBeInTheDocument(); expect(await screen.findByText(values)).toBeInTheDocument();
}); });

View File

@ -26,7 +26,7 @@ import {
HeaderContainer, HeaderContainer,
} from 'src/explore/components/controls/OptionControls'; } from 'src/explore/components/controls/OptionControls';
import { DatasourcePanelDndItem } from 'src/explore/components/DatasourcePanel/types'; import { DatasourcePanelDndItem } from 'src/explore/components/DatasourcePanel/types';
import Icon from 'src/components/Icon'; import Icons from 'src/components/Icons';
import { DndColumnSelectProps } from './types'; import { DndColumnSelectProps } from './types';
export default function DndSelectLabel<T, O>({ export default function DndSelectLabel<T, O>({
@ -54,7 +54,7 @@ export default function DndSelectLabel<T, O>({
function renderGhostButton() { function renderGhostButton() {
return ( return (
<AddControlLabel cancelHover> <AddControlLabel cancelHover>
<Icon name="plus-small" color={theme.colors.grayscale.light1} /> <Icons.PlusSmall iconColor={theme.colors.grayscale.light1} />
{t(props.ghostButtonText || 'Drop columns')} {t(props.ghostButtonText || 'Drop columns')}
</AddControlLabel> </AddControlLabel>
); );

View File

@ -38,7 +38,7 @@ import {
HeaderContainer, HeaderContainer,
LabelsContainer, LabelsContainer,
} from 'src/explore/components/controls/OptionControls'; } from 'src/explore/components/controls/OptionControls';
import Icon from 'src/components/Icon'; import Icons from 'src/components/Icons';
import AdhocFilterPopoverTrigger from 'src/explore/components/controls/FilterControl/AdhocFilterPopoverTrigger'; import AdhocFilterPopoverTrigger from 'src/explore/components/controls/FilterControl/AdhocFilterPopoverTrigger';
import AdhocFilterOption from 'src/explore/components/controls/FilterControl/AdhocFilterOption'; import AdhocFilterOption from 'src/explore/components/controls/FilterControl/AdhocFilterOption';
import AdhocFilter, { import AdhocFilter, {
@ -339,11 +339,9 @@ class AdhocFilterControl extends React.Component {
<ControlHeader {...this.props} /> <ControlHeader {...this.props} />
{this.addNewFilterPopoverTrigger( {this.addNewFilterPopoverTrigger(
<AddIconButton data-test="add-filter-button"> <AddIconButton data-test="add-filter-button">
<Icon <Icons.PlusLarge
name="plus-large" iconSize="s"
width={theme.gridUnit * 3} iconColor={theme.colors.grayscale.light5}
height={theme.gridUnit * 3}
color={theme.colors.grayscale.light5}
/> />
</AddIconButton>, </AddIconButton>,
)} )}
@ -355,10 +353,7 @@ class AdhocFilterControl extends React.Component {
) )
: this.addNewFilterPopoverTrigger( : this.addNewFilterPopoverTrigger(
<AddControlLabel> <AddControlLabel>
<Icon <Icons.PlusSmall iconColor={theme.colors.grayscale.light1} />
name="plus-small"
color={theme.colors.grayscale.light1}
/>
{t('Add filter')} {t('Add filter')}
</AddControlLabel>, </AddControlLabel>,
)} )}

View File

@ -17,7 +17,7 @@
* under the License. * under the License.
*/ */
import React from 'react'; import React from 'react';
import { render, screen } from 'spec/helpers/testing-library'; import { render, screen, waitFor } from 'spec/helpers/testing-library';
import userEvent from '@testing-library/user-event'; import userEvent from '@testing-library/user-event';
import { HTML5Backend } from 'react-dnd-html5-backend'; import { HTML5Backend } from 'react-dnd-html5-backend';
import { DndProvider } from 'react-dnd'; import { DndProvider } from 'react-dnd';
@ -61,30 +61,32 @@ const setup = (props: {
</DndProvider> </DndProvider>
); );
test('should render', () => { test('should render', async () => {
const { container } = render(setup(mockedProps)); const { container } = render(setup(mockedProps));
expect(container).toBeInTheDocument(); await waitFor(() => expect(container).toBeInTheDocument());
}); });
test('should render the control label', () => { test('should render the control label', async () => {
render(setup(mockedProps)); render(setup(mockedProps));
expect(screen.getByText('value > 10')).toBeInTheDocument(); expect(await screen.findByText('value > 10')).toBeInTheDocument();
}); });
test('should render the remove button', () => { test('should render the remove button', async () => {
render(setup(mockedProps)); render(setup(mockedProps));
const removeBtn = screen.getByRole('button'); const removeBtn = await screen.findByRole('button');
expect(removeBtn).toBeInTheDocument(); expect(removeBtn).toBeInTheDocument();
}); });
test('should render the right caret', () => { test('should render the right caret', async () => {
render(setup(mockedProps)); render(setup(mockedProps));
expect(screen.getByRole('img', { name: 'caret-right' })).toBeInTheDocument(); expect(
await screen.findByRole('img', { name: 'caret-right' }),
).toBeInTheDocument();
}); });
test('should render the Popover on clicking the right caret', () => { test('should render the Popover on clicking the right caret', async () => {
render(setup(mockedProps)); render(setup(mockedProps));
const rightCaret = screen.getByRole('img', { name: 'caret-right' }); const rightCaret = await screen.findByRole('img', { name: 'caret-right' });
userEvent.click(rightCaret); userEvent.click(rightCaret);
expect(screen.getByRole('tooltip')).toBeInTheDocument(); expect(screen.getByRole('tooltip')).toBeInTheDocument();
}); });

View File

@ -26,7 +26,7 @@ import {
sqlaAutoGeneratedMetricNameRegex, sqlaAutoGeneratedMetricNameRegex,
druidAutoGeneratedMetricRegex, druidAutoGeneratedMetricRegex,
} from 'src/explore/constants'; } from 'src/explore/constants';
import Icon from 'src/components/Icon'; import Icons from 'src/components/Icons';
import { import {
AddIconButton, AddIconButton,
AddControlLabel, AddControlLabel,
@ -386,11 +386,9 @@ class MetricsControl extends React.PureComponent {
disabled={this.isAddNewMetricDisabled()} disabled={this.isAddNewMetricDisabled()}
data-test="add-metric-button" data-test="add-metric-button"
> >
<Icon <Icons.PlusLarge
name="plus-large" iconSize="s"
width={theme.gridUnit * 3} iconColor={theme.colors.grayscale.light5}
height={theme.gridUnit * 3}
color={theme.colors.grayscale.light5}
/> />
</AddIconButton>, </AddIconButton>,
)} )}
@ -402,10 +400,7 @@ class MetricsControl extends React.PureComponent {
) )
: this.addNewMetricPopoverTrigger( : this.addNewMetricPopoverTrigger(
<AddControlLabel> <AddControlLabel>
<Icon <Icons.PlusSmall iconColor={theme.colors.grayscale.light1} />
name="plus-small"
color={theme.colors.grayscale.light1}
/>
{t('Add metric')} {t('Add metric')}
</AddControlLabel>, </AddControlLabel>,
)} )}

View File

@ -17,7 +17,12 @@
* under the License. * under the License.
*/ */
import React from 'react'; import React from 'react';
import { render, screen, fireEvent } from 'spec/helpers/testing-library'; import {
render,
screen,
fireEvent,
waitFor,
} from 'spec/helpers/testing-library';
import { DndProvider } from 'react-dnd'; import { DndProvider } from 'react-dnd';
import { HTML5Backend } from 'react-dnd-html5-backend'; import { HTML5Backend } from 'react-dnd-html5-backend';
import { import {
@ -51,29 +56,30 @@ const setup = (overrides?: Record<string, any>) =>
</DndProvider>, </DndProvider>,
); );
test('should render', () => { test('should render', async () => {
const { container } = setup(); const { container } = setup();
expect(container).toBeVisible(); await waitFor(() => expect(container).toBeVisible());
}); });
test('should display a label', () => { test('should display a label', async () => {
setup(); setup();
expect(screen.getByText('Test label')).toBeTruthy(); expect(await screen.findByText('Test label')).toBeTruthy();
}); });
test('should display a certification icon if saved metric is certified', () => { test('should display a certification icon if saved metric is certified', async () => {
const { container } = setup({ const { container } = setup({
savedMetric: { savedMetric: {
metric_name: 'test_metric', metric_name: 'test_metric',
is_certified: true, is_certified: true,
}, },
}); });
screen.getByText('test_metric'); await waitFor(() => {
expect(screen.queryByText('Test label')).toBeFalsy(); expect(screen.queryByText('Test label')).toBeFalsy();
expect(container.querySelector('.metric-option > svg')).toBeInTheDocument(); expect(container.querySelector('.metric-option > svg')).toBeInTheDocument();
});
}); });
test('triggers onMoveLabel on drop', () => { test('triggers onMoveLabel on drop', async () => {
render( render(
<DndProvider backend={HTML5Backend}> <DndProvider backend={HTML5Backend}>
<OptionControlLabel <OptionControlLabel
@ -88,9 +94,11 @@ test('triggers onMoveLabel on drop', () => {
/> />
</DndProvider>, </DndProvider>,
); );
fireEvent.dragStart(screen.getByText('Label 1')); await waitFor(() => {
fireEvent.drop(screen.getByText('Label 2')); fireEvent.dragStart(screen.getByText('Label 1'));
expect(defaultProps.onMoveLabel).toHaveBeenCalled(); fireEvent.drop(screen.getByText('Label 2'));
expect(defaultProps.onMoveLabel).toHaveBeenCalled();
});
}); });
test('renders DragContainer', () => { test('renders DragContainer', () => {