Commit 35d2bf83 by Ari Rizzitano Committed by GitHub

Merge pull request #33 from edx/ari/fix-dropdown

patch dropdown for bootstrap v4
parents bdde7afe e68a5c83
...@@ -91,7 +91,7 @@ exports[`Storyshots Dropdown basic usage 1`] = ` ...@@ -91,7 +91,7 @@ exports[`Storyshots Dropdown basic usage 1`] = `
<button <button
aria-expanded={false} aria-expanded={false}
aria-haspopup="true" aria-haspopup="true"
className="btn-borderless dropdown-toggle btn btn-secondary" className="dropdown-toggle btn btn-light"
onBlur={[Function]} onBlur={[Function]}
onClick={[Function]} onClick={[Function]}
onKeyDown={[Function]} onKeyDown={[Function]}
...@@ -99,49 +99,37 @@ exports[`Storyshots Dropdown basic usage 1`] = ` ...@@ -99,49 +99,37 @@ exports[`Storyshots Dropdown basic usage 1`] = `
> >
Search Engines Search Engines
</button> </button>
<ul <div
aria-hidden={true} aria-hidden={true}
aria-label="Search Engines" aria-label="Search Engines"
className="dropdown-menu" className="dropdown-menu"
role="menu" role="menu"
> >
<li
className="dropdown-item"
>
<a <a
className="dropdown-item"
href="https://google.com" href="https://google.com"
onKeyDown={[Function]} onKeyDown={[Function]}
role="menuitem" role="menuitem"
tabIndex="-1"
> >
Google Google
</a> </a>
</li>
<li
className="dropdown-item"
>
<a <a
className="dropdown-item"
href="https://duckduckgo.com" href="https://duckduckgo.com"
onKeyDown={[Function]} onKeyDown={[Function]}
role="menuitem" role="menuitem"
tabIndex="-1"
> >
DuckDuckGo DuckDuckGo
</a> </a>
</li>
<li
className="dropdown-item"
>
<a <a
className="dropdown-item"
href="https://yahoo.com" href="https://yahoo.com"
onKeyDown={[Function]} onKeyDown={[Function]}
role="menuitem" role="menuitem"
tabIndex="-1"
> >
Yahoo Yahoo
</a> </a>
</li> </div>
</ul>
</div> </div>
`; `;
......
@import "~bootstrap/scss/_dropdown"; @import "~bootstrap/scss/_dropdown";
.btn-borderless { // Trying to patch this upstream, then this can
border: 0 !important; // be removed.
// https://github.com/twbs/bootstrap/pull/23990
.show {
> a:focus {
outline-width: 2px;
outline-style: solid;
outline-color: Highlight;
outline: -webkit-focus-ring-color auto 5px;
}
} }
...@@ -26,14 +26,14 @@ describe('<Dropdown />', () => { ...@@ -26,14 +26,14 @@ describe('<Dropdown />', () => {
{...props} {...props}
/>, />,
); );
const menu = wrapper.find('ul'); const menu = wrapper.find('.dropdown-menu');
const button = wrapper.find('[type="button"]'); const button = wrapper.find('[type="button"]');
it('with menu and toggle', () => { it('with menu and toggle', () => {
expect(button.exists()).toEqual(true); expect(button.exists()).toEqual(true);
expect(menu.prop('aria-label')).toEqual(props.title); expect(menu.prop('aria-label')).toEqual(props.title);
expect(menu.exists()).toEqual(true); expect(menu.exists()).toEqual(true);
expect(menu.find('li')).toHaveLength(props.menuItems.length); expect(menu.find('a')).toHaveLength(props.menuItems.length);
}); });
it('with menu closed', () => { it('with menu closed', () => {
...@@ -110,7 +110,7 @@ describe('<Dropdown />', () => { ...@@ -110,7 +110,7 @@ describe('<Dropdown />', () => {
{ attachTo: div }, { attachTo: div },
); );
wrapper.find('[type="button"]').simulate('click'); wrapper.find('[type="button"]').simulate('click');
document.querySelector('ul').click(); document.querySelector('.dropdown-menu').click();
menuOpen(true, wrapper); menuOpen(true, wrapper);
}); });
......
...@@ -98,19 +98,18 @@ class Dropdown extends React.Component { ...@@ -98,19 +98,18 @@ class Dropdown extends React.Component {
generateMenuItems(menuItems) { generateMenuItems(menuItems) {
return menuItems.map((menuItem, i) => ( return menuItems.map((menuItem, i) => (
<li className={styles['dropdown-item']} key={i}>
<a <a
role="menuitem" className={styles['dropdown-item']}
href={menuItem.href} href={menuItem.href}
key={i}
onKeyDown={this.handleMenuKeyDown} onKeyDown={this.handleMenuKeyDown}
ref={(item) => { ref={(item) => {
this.menuItems[i] = item; this.menuItems[i] = item;
}} }}
tabIndex="-1" role="menuitem"
> >
{menuItem.label} {menuItem.label}
</a> </a>
</li>
)); ));
} }
...@@ -127,36 +126,43 @@ class Dropdown extends React.Component { ...@@ -127,36 +126,43 @@ class Dropdown extends React.Component {
<Button <Button
aria-expanded={this.state.open} aria-expanded={this.state.open}
aria-haspopup="true" aria-haspopup="true"
buttonType="secondary" buttonType={this.props.buttonType}
display={this.props.title} display={this.props.title}
onClick={this.toggle} onClick={this.toggle}
onKeyDown={this.handleToggleKeyDown} onKeyDown={this.handleToggleKeyDown}
className={[ className={[
styles['btn-borderless'],
styles['dropdown-toggle'], styles['dropdown-toggle'],
]} ]}
type="button" type="button"
inputRef={(toggleElem) => { this.toggleElem = toggleElem; }} inputRef={(toggleElem) => { this.toggleElem = toggleElem; }}
/> />
<ul <div
aria-label={this.props.title} aria-label={this.props.title}
aria-hidden={!this.state.open} aria-hidden={!this.state.open}
className={styles['dropdown-menu']} className={classNames([
styles['dropdown-menu'],
{ [styles.show]: this.state.open },
])}
role="menu" role="menu"
> >
{menuItems} {menuItems}
</ul> </div>
</div> </div>
); );
} }
} }
Dropdown.propTypes = { Dropdown.propTypes = {
title: PropTypes.string.isRequired, buttonType: PropTypes.string,
menuItems: PropTypes.arrayOf(PropTypes.shape({ menuItems: PropTypes.arrayOf(PropTypes.shape({
label: PropTypes.string, label: PropTypes.string,
href: PropTypes.string, href: PropTypes.string,
})).isRequired, })).isRequired,
title: PropTypes.string.isRequired,
};
Dropdown.defaultProps = {
buttonType: 'light',
}; };
export default Dropdown; export default Dropdown;
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