parent
6d04c80302
commit
cdda52d799
@ -0,0 +1,61 @@ |
||||
import React, { PureComponent } from 'react' |
||||
import PropTypes from 'prop-types' |
||||
import classnames from 'classnames' |
||||
|
||||
export default class ButtonGroup extends PureComponent { |
||||
static propTypes = { |
||||
defaultActiveButtonIndex: PropTypes.number, |
||||
disabled: PropTypes.bool, |
||||
children: PropTypes.array, |
||||
className: PropTypes.string, |
||||
style: PropTypes.object, |
||||
} |
||||
|
||||
static defaultProps = { |
||||
className: 'button-group', |
||||
} |
||||
|
||||
state = { |
||||
activeButtonIndex: this.props.defaultActiveButtonIndex || 0, |
||||
} |
||||
|
||||
handleButtonClick (activeButtonIndex) { |
||||
this.setState({ activeButtonIndex }) |
||||
} |
||||
|
||||
renderButtons () { |
||||
const { children, disabled } = this.props |
||||
|
||||
return React.Children.map(children, (child, index) => { |
||||
return child && ( |
||||
<button |
||||
className={classnames( |
||||
'button-group__button', |
||||
{ 'button-group__button--active': index === this.state.activeButtonIndex }, |
||||
)} |
||||
onClick={() => { |
||||
this.handleButtonClick(index) |
||||
child.props.onClick && child.props.onClick() |
||||
}} |
||||
disabled={disabled || child.props.disabled} |
||||
key={index} |
||||
> |
||||
{ child.props.children } |
||||
</button> |
||||
) |
||||
}) |
||||
} |
||||
|
||||
render () { |
||||
const { className, style } = this.props |
||||
|
||||
return ( |
||||
<div |
||||
className={className} |
||||
style={style} |
||||
> |
||||
{ this.renderButtons() } |
||||
</div> |
||||
) |
||||
} |
||||
} |
@ -0,0 +1,49 @@ |
||||
import React from 'react' |
||||
import { storiesOf } from '@storybook/react' |
||||
import { action } from '@storybook/addon-actions' |
||||
import ButtonGroup from './' |
||||
import Button from '../button' |
||||
import { text, boolean } from '@storybook/addon-knobs/react' |
||||
|
||||
storiesOf('ButtonGroup', module) |
||||
.add('with Buttons', () => |
||||
<ButtonGroup |
||||
style={{ width: '300px' }} |
||||
disabled={boolean('Disabled', false)} |
||||
defaultActiveButtonIndex={1} |
||||
> |
||||
<Button |
||||
onClick={action('cheap')} |
||||
> |
||||
{text('Button1', 'Cheap')} |
||||
</Button> |
||||
<Button |
||||
onClick={action('average')} |
||||
> |
||||
{text('Button2', 'Average')} |
||||
</Button> |
||||
<Button |
||||
onClick={action('fast')} |
||||
> |
||||
{text('Button3', 'Fast')} |
||||
</Button> |
||||
</ButtonGroup> |
||||
) |
||||
.add('with a disabled Button', () => |
||||
<ButtonGroup |
||||
style={{ width: '300px' }} |
||||
disabled={boolean('Disabled', false)} |
||||
> |
||||
<Button |
||||
onClick={action('enabled')} |
||||
> |
||||
{text('Button1', 'Enabled')} |
||||
</Button> |
||||
<Button |
||||
onClick={action('disabled')} |
||||
disabled |
||||
> |
||||
{text('Button2', 'Disabled')} |
||||
</Button> |
||||
</ButtonGroup> |
||||
) |
@ -0,0 +1 @@ |
||||
export { default } from './button-group.component' |
@ -0,0 +1,38 @@ |
||||
.button-group { |
||||
display: flex; |
||||
justify-content: center; |
||||
align-items: center; |
||||
|
||||
&__button { |
||||
font-family: Roboto; |
||||
font-size: 1rem; |
||||
color: $tundora; |
||||
border-style: solid; |
||||
border-color: $alto; |
||||
border-width: 1px 1px 1px; |
||||
border-left: 0; |
||||
flex: 1; |
||||
padding: 12px; |
||||
white-space: nowrap; |
||||
overflow: hidden; |
||||
text-overflow: ellipsis; |
||||
|
||||
&:first-child { |
||||
border-left: 1px solid $alto; |
||||
border-radius: 4px 0 0 4px; |
||||
} |
||||
|
||||
&:last-child { |
||||
border-radius: 0 4px 4px 0; |
||||
} |
||||
|
||||
&--active { |
||||
background-color: $dodger-blue; |
||||
color: $white; |
||||
} |
||||
|
||||
&:disabled { |
||||
opacity: .5; |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue