Skip to content

Commit 9896cdb

Browse files
author
Avi Sharvit
committed
feat(DropdownButton): DropdownButton and SplitButton components
Export DropdownButton and SplitButton from react-bootstrap re #11
1 parent d30ce8f commit 9896cdb

File tree

12 files changed

+952
-25
lines changed

12 files changed

+952
-25
lines changed

package-lock.json

Lines changed: 17 additions & 17 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/Button/Button.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@ import { BUTTON_BS_STYLES } from './constants';
55

66
const Button = props => <BsButton {...props} />;
77

8-
Button.propTypes = Object.assign(BsButton.propTypes, {
8+
Button.propTypes = {
9+
...BsButton.propTypes,
910
bsStyle: PropTypes.oneOf(BUTTON_BS_STYLES),
10-
});
11+
};
1112

1213
Button.BUTTON_BS_STYLES = BUTTON_BS_STYLES;
1314

src/components/Button/Button.stories.js

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
import React from 'react';
22
import { storiesOf } from '@storybook/react';
3+
import { action } from '@storybook/addon-actions';
4+
import { withKnobs, select } from '@storybook/addon-knobs';
35
import { defaultTemplate } from '../../../storybook/decorators/storyTemplates';
4-
import { Button, ButtonGroup } from './index';
5-
import { Grid, Row, Col } from '../../index';
6+
import { Grid, Row, Col, MenuItem } from '../../index';
7+
import { Button, ButtonGroup, DropdownButton, SplitButton } from './index';
8+
import { BUTTON_BS_STYLES } from './constants';
69

710
const stories = storiesOf('Button', module);
811

@@ -16,6 +19,7 @@ const description = (
1619
</p>
1720
);
1821

22+
stories.addDecorator(withKnobs);
1923
stories.addDecorator(
2024
defaultTemplate({
2125
title: 'Button',
@@ -138,3 +142,43 @@ stories.addWithInfo('ButtonGroup', () => {
138142
</Grid>
139143
);
140144
});
145+
146+
stories.addWithInfo('DropdownButton', '', () => {
147+
const bsStyle = select('Style', BUTTON_BS_STYLES, 'default');
148+
const bsSize = select('Size', [undefined, 'xsmall', 'small', 'large']);
149+
150+
const props = { bsStyle, title: bsStyle, id: 'dropdown-example' };
151+
if (bsSize) props.bsSize = bsSize;
152+
153+
return (
154+
<DropdownButton {...props} onClick={action('onClick')}>
155+
<MenuItem eventKey="1">Action</MenuItem>
156+
<MenuItem eventKey="2">Another action</MenuItem>
157+
<MenuItem eventKey="3" active>
158+
Active Item
159+
</MenuItem>
160+
<MenuItem divider />
161+
<MenuItem eventKey="4">Separated link</MenuItem>
162+
</DropdownButton>
163+
);
164+
});
165+
166+
stories.addWithInfo('SplitButton', '', () => {
167+
const bsStyle = select('Style', BUTTON_BS_STYLES, 'default');
168+
const bsSize = select('Size', [undefined, 'xsmall', 'small', 'large']);
169+
170+
const props = { bsStyle, title: bsStyle, id: 'dropdown-example' };
171+
if (bsSize) props.bsSize = bsSize;
172+
173+
return (
174+
<SplitButton {...props} onClick={action('onClick')}>
175+
<MenuItem eventKey="1">Action</MenuItem>
176+
<MenuItem eventKey="2">Another action</MenuItem>
177+
<MenuItem eventKey="3" active>
178+
Active Item
179+
</MenuItem>
180+
<MenuItem divider />
181+
<MenuItem eventKey="4">Separated link</MenuItem>
182+
</SplitButton>
183+
);
184+
});
Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
1-
import { ButtonGroup } from 'react-bootstrap';
2-
export default ButtonGroup;
1+
export { ButtonGroup as default } from 'react-bootstrap';
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import React from 'react';
2+
import PropTypes from 'prop-types';
3+
import { DropdownButton as BsDropdownButton } from 'react-bootstrap';
4+
import { BUTTON_BS_STYLES } from './constants';
5+
6+
const DropdownButton = props => <BsDropdownButton {...props} />;
7+
8+
DropdownButton.propTypes = {
9+
...BsDropdownButton.propTypes,
10+
bsStyle: PropTypes.oneOf(BUTTON_BS_STYLES),
11+
};
12+
13+
DropdownButton.BUTTON_BS_STYLES = BUTTON_BS_STYLES;
14+
15+
export default DropdownButton;
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/* eslint-env jest */
2+
3+
import React from 'react';
4+
import renderer from 'react-test-renderer';
5+
6+
import DropdownButton from './DropdownButton';
7+
import { MenuItem } from '../MenuItem';
8+
9+
test('DropdownButton should renders properly', () => {
10+
DropdownButton.BUTTON_BS_STYLES.forEach(bsStyle => {
11+
const component = renderer.create(
12+
<DropdownButton title={bsStyle} id={`dropdown-button-test-${bsStyle}`}>
13+
<MenuItem eventKey="1">Action</MenuItem>
14+
<MenuItem eventKey="2">Another action</MenuItem>
15+
<MenuItem eventKey="3" active>
16+
Active Item
17+
</MenuItem>
18+
<MenuItem divider />
19+
<MenuItem eventKey="4">Separated link</MenuItem>
20+
</DropdownButton>,
21+
);
22+
23+
const tree = component.toJSON();
24+
expect(tree).toMatchSnapshot();
25+
});
26+
});
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import React from 'react';
2+
import PropTypes from 'prop-types';
3+
import { SplitButton as BsSplitButton } from 'react-bootstrap';
4+
import { BUTTON_BS_STYLES } from './constants';
5+
6+
const SplitButton = props => <BsSplitButton {...props} />;
7+
8+
SplitButton.propTypes = {
9+
...BsSplitButton.propTypes,
10+
bsStyle: PropTypes.oneOf(BUTTON_BS_STYLES),
11+
};
12+
13+
SplitButton.BUTTON_BS_STYLES = BUTTON_BS_STYLES;
14+
15+
export default SplitButton;
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/* eslint-env jest */
2+
3+
import React from 'react';
4+
import renderer from 'react-test-renderer';
5+
6+
import SplitButton from './SplitButton';
7+
import { MenuItem } from '../MenuItem';
8+
9+
test('SplitButton should renders properly', () => {
10+
SplitButton.BUTTON_BS_STYLES.forEach(bsStyle => {
11+
const component = renderer.create(
12+
<SplitButton title={bsStyle} id={`dropdown-button-test-${bsStyle}`}>
13+
<MenuItem eventKey="1">Action</MenuItem>
14+
<MenuItem eventKey="2">Another action</MenuItem>
15+
<MenuItem eventKey="3" active>
16+
Active Item
17+
</MenuItem>
18+
<MenuItem divider />
19+
<MenuItem eventKey="4">Separated link</MenuItem>
20+
</SplitButton>,
21+
);
22+
23+
const tree = component.toJSON();
24+
expect(tree).toMatchSnapshot();
25+
});
26+
});

0 commit comments

Comments
 (0)