Skip to content

Commit a2ea178

Browse files
committed
feat(ButtonDropdown): wrap Dropdown for ButtonDropdown
1 parent 3d48e8c commit a2ea178

6 files changed

Lines changed: 97 additions & 4 deletions

File tree

example/js/DropdownsExample.jsx

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* eslint react/no-multi-comp: 0, react/prop-types: 0 */
22

33
import React from 'react';
4-
import { Button, Dropdown, DropdownItem, DropdownMenu, DropdownToggle } from 'lib/index';
4+
import { Button, ButtonDropdown, Dropdown, DropdownItem, DropdownMenu, DropdownToggle } from 'lib/index';
55

66
class DropdownsExample extends React.Component {
77
render() {
@@ -46,6 +46,31 @@ class DropdownsExample extends React.Component {
4646
<DropdownItem>Another Action</DropdownItem>
4747
</DropdownMenu>
4848
</Dropdown>
49+
<p>Button Dropdown</p>
50+
<ButtonDropdown className="m-r-1">
51+
<DropdownToggle caret>
52+
<Button color="primary">Button Dropdown</Button>
53+
</DropdownToggle>
54+
<DropdownMenu>
55+
<DropdownItem header>Header</DropdownItem>
56+
<DropdownItem disabled>Action</DropdownItem>
57+
<DropdownItem>Another Action</DropdownItem>
58+
<DropdownItem divider/>
59+
<DropdownItem>Another Action</DropdownItem>
60+
</DropdownMenu>
61+
</ButtonDropdown>
62+
<ButtonDropdown>
63+
<DropdownToggle caret>
64+
<Button color="primary">Button Dropdown</Button>
65+
</DropdownToggle>
66+
<DropdownMenu right>
67+
<DropdownItem header>Header</DropdownItem>
68+
<DropdownItem disabled>Action</DropdownItem>
69+
<DropdownItem>Another Action</DropdownItem>
70+
<DropdownItem divider/>
71+
<DropdownItem>Another Action</DropdownItem>
72+
</DropdownMenu>
73+
</ButtonDropdown>
4974
</div>
5075
);
5176
}

lib/ButtonDropdown.jsx

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import React, { PropTypes } from 'react';
2+
import Dropdown from './Dropdown';
3+
4+
const propTypes = {
5+
children: PropTypes.node
6+
};
7+
8+
class ButtonDropdown extends React.Component {
9+
constructor(props) {
10+
super(props);
11+
}
12+
13+
render() {
14+
const {
15+
children,
16+
...attributes
17+
} = this.props;
18+
19+
return (
20+
<Dropdown {...attributes} group>
21+
{children}
22+
</Dropdown>
23+
);
24+
}
25+
}
26+
27+
ButtonDropdown.propTypes = propTypes;
28+
29+
export default ButtonDropdown;

lib/Dropdown.jsx

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import omit from 'lodash.omit';
44

55
const propTypes = {
66
disabled: PropTypes.bool,
7+
dropup: PropTypes.bool,
8+
group: PropTypes.bool,
79
open: PropTypes.bool,
810
tag: PropTypes.string
911
};
@@ -93,14 +95,19 @@ class Dropdown extends React.Component {
9395
render() {
9496
const {
9597
className,
98+
dropup,
99+
group,
96100
'tag': TagName,
97101
...attributes
98102
} = omit(this.props, ['children', 'open']);
99103

100104
const classes = classNames(
101105
className,
102-
'dropdown',
103-
{ 'open': this.state.open }
106+
group ? 'btn-group' : 'dropdown',
107+
{
108+
open: this.state.open,
109+
dropup: dropup
110+
}
104111
);
105112

106113
return (

lib/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import Button from './Button';
2+
import ButtonDropdown from './ButtonDropdown';
23
import ButtonGroup from './ButtonGroup';
34
import ButtonToolbar from './ButtonToolbar';
45
import Dropdown from './Dropdown';
@@ -8,6 +9,7 @@ import DropdownToggle from './DropdownToggle';
89

910
export {
1011
Button,
12+
ButtonDropdown,
1113
ButtonGroup,
1214
ButtonToolbar,
1315
Dropdown,

test/ButtonDropdown.spec.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/* eslint react/no-multi-comp: 0, react/prop-types: 0 */
2+
import React from 'react';
3+
import { mount } from 'enzyme';
4+
import { ButtonDropdown, DropdownToggle, DropdownMenu, DropdownItem } from '../lib';
5+
6+
7+
describe('ButtonDropdown', () => {
8+
it('should render a single child', () => {
9+
const wrapper = mount(<ButtonDropdown>Ello world</ButtonDropdown>);
10+
11+
expect(wrapper.text()).toBe('Ello world');
12+
expect(wrapper.find('.btn-group').length).toBe(1);
13+
});
14+
15+
it('should render multiple children', () => {
16+
const wrapper = mount(
17+
<ButtonDropdown>
18+
<DropdownToggle>Toggle</DropdownToggle>
19+
<DropdownMenu>
20+
<DropdownItem>Test</DropdownItem>
21+
</DropdownMenu>
22+
</ButtonDropdown>
23+
);
24+
25+
expect(wrapper.find('.btn').text()).toBe('Toggle');
26+
expect(wrapper.find('.btn-group').length).toBe(1);
27+
expect(wrapper.find('.dropdown-item').length).toBe(1);
28+
expect(wrapper.children().length).toBe(2);
29+
});
30+
});

test/Dropdown.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* eslint react/no-multi-comp: 0, react/prop-types: 0 */
22
import React from 'react';
3-
import { shallow, mount, render } from 'enzyme';
3+
import { mount } from 'enzyme';
44
import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from '../lib';
55

66

0 commit comments

Comments
 (0)