Unverified Commit dc3a4beb authored by Marcos Iglesias's avatar Marcos Iglesias Committed by GitHub

Uses button for clear on filters (#488)

parent df559ade
...@@ -144,6 +144,22 @@ ...@@ -144,6 +144,22 @@
} }
} }
&.btn-link {
color: $link-color;
text-decoration: none;
padding: 0 4px 0 4px;
&:hover,
&:focus {
color: $link-hover-color;
}
&:focus {
outline: 5px auto $link-hover-color;
outline-offset: -2px;
}
}
&.disabled, &.disabled,
&:disabled { &:disabled {
-webkit-box-shadow: none; -webkit-box-shadow: none;
......
...@@ -16,34 +16,33 @@ import { ...@@ -16,34 +16,33 @@ import {
} from '.'; } from '.';
import { CLEAR_BTN_TEXT } from '../constants'; import { CLEAR_BTN_TEXT } from '../constants';
describe('FilterSection', () => { const setup = (propOverrides?: Partial<FilterSectionProps>) => {
const setup = (propOverrides?: Partial<FilterSectionProps>) => { const props: FilterSectionProps = {
const props: FilterSectionProps = { categoryId: 'testId',
categoryId: 'testId', hasValue: true,
hasValue: true, title: 'Category',
title: 'Category', clearFilter: jest.fn(),
clearFilter: jest.fn(), type: FilterType.INPUT_SELECT,
type: FilterType.INPUT_SELECT, ...propOverrides,
...propOverrides,
};
const wrapper = shallow<FilterSection>(<FilterSection {...props} />);
return { props, wrapper };
}; };
const wrapper = shallow<FilterSection>(<FilterSection {...props} />);
return { props, wrapper };
};
describe('FilterSection', () => {
describe('onClearFilter', () => { describe('onClearFilter', () => {
let props; let props;
let wrapper; let wrapper;
let clearFilterSpy; let clearFilterSpy;
beforeAll(() => { beforeAll(() => {
const setupResult = setup(); ({ props, wrapper } = setup());
props = setupResult.props;
wrapper = setupResult.wrapper;
clearFilterSpy = jest.spyOn(props, 'clearFilter'); clearFilterSpy = jest.spyOn(props, 'clearFilter');
}); });
it('calls props.clearFilter with props.categoryId', () => { it('calls props.clearFilter with props.categoryId', () => {
wrapper.instance().onClearFilter(); wrapper.instance().onClearFilter();
expect(clearFilterSpy).toHaveBeenCalledWith(props.categoryId); expect(clearFilterSpy).toHaveBeenCalledWith(props.categoryId);
}); });
}); });
...@@ -52,6 +51,7 @@ describe('FilterSection', () => { ...@@ -52,6 +51,7 @@ describe('FilterSection', () => {
it('returns an InputFilter w/ correct props if props.type == FilterType.INPUT_SELECT', () => { it('returns an InputFilter w/ correct props if props.type == FilterType.INPUT_SELECT', () => {
const { props, wrapper } = setup({ type: FilterType.INPUT_SELECT }); const { props, wrapper } = setup({ type: FilterType.INPUT_SELECT });
const content = wrapper.instance().renderFilterComponent(); const content = wrapper.instance().renderFilterComponent();
// @ts-ignore: This check works but TypeScript complains // @ts-ignore: This check works but TypeScript complains
expect(content.type.displayName).toBe('Connect(InputFilter)'); expect(content.type.displayName).toBe('Connect(InputFilter)');
expect(content.props.categoryId).toBe(props.categoryId); expect(content.props.categoryId).toBe(props.categoryId);
...@@ -64,6 +64,7 @@ describe('FilterSection', () => { ...@@ -64,6 +64,7 @@ describe('FilterSection', () => {
options: mockOptions, options: mockOptions,
}); });
const content = wrapper.instance().renderFilterComponent(); const content = wrapper.instance().renderFilterComponent();
// @ts-ignore: This check works but TypeScript complains // @ts-ignore: This check works but TypeScript complains
expect(content.type.displayName).toBe('Connect(CheckBoxFilter)'); expect(content.type.displayName).toBe('Connect(CheckBoxFilter)');
expect(content.props.categoryId).toBe(props.categoryId); expect(content.props.categoryId).toBe(props.categoryId);
...@@ -74,12 +75,10 @@ describe('FilterSection', () => { ...@@ -74,12 +75,10 @@ describe('FilterSection', () => {
describe('render', () => { describe('render', () => {
let props; let props;
let wrapper; let wrapper;
let renderFilterComponentSpy; let renderFilterComponentSpy;
beforeAll(() => { beforeAll(() => {
const setupResult = setup(); ({ props, wrapper } = setup());
props = setupResult.props;
wrapper = setupResult.wrapper;
renderFilterComponentSpy = jest.spyOn( renderFilterComponentSpy = jest.spyOn(
wrapper.instance(), wrapper.instance(),
'renderFilterComponent' 'renderFilterComponent'
...@@ -94,16 +93,20 @@ describe('FilterSection', () => { ...@@ -94,16 +93,20 @@ describe('FilterSection', () => {
const mockHelpText = 'Help me'; const mockHelpText = 'Help me';
const { wrapper } = setup({ helpText: mockHelpText }); const { wrapper } = setup({ helpText: mockHelpText });
const infoButton = wrapper.find(InfoButton); const infoButton = wrapper.find(InfoButton);
expect(infoButton.exists()).toBe(true); expect(infoButton.exists()).toBe(true);
expect(infoButton.props().infoText).toBe(mockHelpText); expect(infoButton.props().infoText).toBe(mockHelpText);
}); });
it('renders link to clear category if props.hasValue', () => { it('renders button to clear category if props.hasValue', () => {
const { props, wrapper } = setup({ hasValue: true }); const { wrapper } = setup({ hasValue: true });
const clearLink = wrapper.find('a'); const clearButton = wrapper.find('button');
expect(clearLink.exists()).toBe(true);
expect(clearLink.props().onClick).toBe(wrapper.instance().onClearFilter); expect(clearButton.exists()).toBe(true);
expect(clearLink.text()).toEqual(CLEAR_BTN_TEXT); expect(clearButton.props().onClick).toBe(
wrapper.instance().onClearFilter
);
expect(clearButton.text()).toEqual(CLEAR_BTN_TEXT);
}); });
it('calls renderFilterComponent()', () => { it('calls renderFilterComponent()', () => {
...@@ -190,8 +193,9 @@ describe('FilterSection', () => { ...@@ -190,8 +193,9 @@ describe('FilterSection', () => {
describe('mapDispatchToProps', () => { describe('mapDispatchToProps', () => {
let dispatch; let dispatch;
let result; let result;
beforeAll(() => { beforeAll(() => {
const { props } = setup(); setup();
dispatch = jest.fn(() => Promise.resolve()); dispatch = jest.fn(() => Promise.resolve());
result = mapDispatchToProps(dispatch); result = mapDispatchToProps(dispatch);
}); });
......
...@@ -58,7 +58,10 @@ export class FilterSection extends React.Component<FilterSectionProps> { ...@@ -58,7 +58,10 @@ export class FilterSection extends React.Component<FilterSectionProps> {
<div className="search-filter-section"> <div className="search-filter-section">
<div className="search-filter-section-header"> <div className="search-filter-section-header">
<div className="search-filter-section-title"> <div className="search-filter-section-title">
<label className="title-2" htmlFor={categoryId}> <label
className="search-filter-section-label title-2"
htmlFor={categoryId}
>
{title} {title}
</label> </label>
{helpText && ( {helpText && (
...@@ -66,11 +69,13 @@ export class FilterSection extends React.Component<FilterSectionProps> { ...@@ -66,11 +69,13 @@ export class FilterSection extends React.Component<FilterSectionProps> {
)} )}
</div> </div>
{hasValue && ( {hasValue && (
/* eslint-disable jsx-a11y/anchor-is-valid */ <button
<a onClick={this.onClearFilter} className="btn btn-flat-icon"> onClick={this.onClearFilter}
<img className="icon icon-left" alt="" /> className="btn btn-link clear-button"
<span>{CLEAR_BTN_TEXT}</span> type="button"
</a> >
{CLEAR_BTN_TEXT}
</button>
)} )}
</div> </div>
{this.renderFilterComponent()} {this.renderFilterComponent()}
......
...@@ -7,19 +7,19 @@ ...@@ -7,19 +7,19 @@
.search-filter-section-header { .search-filter-section-header {
display: flex; display: flex;
}
.search-filter-section-title { .search-filter-section-title {
display: flex; display: flex;
flex-grow: 1; flex-grow: 1;
}
button { .info-button {
margin: auto 4px; margin: auto 4px !important;
} }
label { .search-filter-section-label {
margin-bottom: 0; margin-bottom: 0;
}
}
} }
.input-section-content { .input-section-content {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment