import React from 'react'
import PropTypes from 'prop-types'
import Component from '../utils/Component'
import classnames from 'classnames'
import Logger from '../utils/logger'
import '../style'
import 'phoenix-styles/less/modules/button-group.less'
/**
* 按钮组组件<br/>
* - 按钮组组件配合Button组件,提供了横、竖两种排列方式, 可选default,justify,segmente,tacked,footer。
* - 可通过index设置默认的选中索引值。
* - 可通过clickCallback实现点击回调,default和footer模式下不支持clickCallback。
*
* 主要属性和接口:
* - phType:是否自适应宽度或者垂直排列, 默认default <br/>
* 如:
* ```code
* <ButtonGroup phType='tacked'>
* <Button block>tacked1</Button>
* <Button block>tacked2</Button>
* </ButtonGroup>
* ```
* index:默认的选中索引值, 默认0 <br/>
* 如:
* ```code
* <ButtonGroup phType='justify' index={1}>
* <Button>justify</Button>
* <Button>justify</Button>
* </ButtonGroup>
* ```
* - clickCallback:点击按钮组的回调函数。<br/>
* ```code
* <ButtonGroup clickCallback={(target,html)=>{console.log(target,html);}}>
* <Button>tacked1</Button>
* <Button>tacked2</Button>
* </ButtonGroup>
* ```
*
* @class ButtonGroup
* @module 基础组件
* @extends Component
* @constructor
* @since 0.1.4
* @demo buttongroup|button-group.js {展示}
* @show true
* */
export default class ButtonGroup extends Component{
static propTypes={
/**
* 样式前缀
* @property classPrefix
* @type String
* @default 'button-group'
* */
classPrefix: PropTypes.string,
/**
* 默认索引值
* @property index
* @type Number
* @default 0
* */
index: PropTypes.number,
/**
* 是否有自适应宽度,垂直排列等属性,取值为default(用于双按钮)、justify(水平排列)、tacked(垂直排列)、segmente(分割排列)、footer(尾部按钮)
* @property phType
* @type String
* @default 'default'
* */
phType:PropTypes.string,
/**
* 更多内容,传递的类型是react element
* @property extra
* @type Object
* @default null
* */
extra: PropTypes.element,
/**
* 按钮被按下后的回调
* @method clickCallback
* @param {number} index 选中的索引值
* @type Function
* */
clickCallback:PropTypes.func
};
static defaultProps = {
clickable: true, // for modal
index: 0,
phType:'default',
classPrefix:'button-group',
componentTag:'div',
extra: null,
classMapping : {
'default':'default',
'justify':'justify',
'tacked':'tacked',
'segmente':'segmente',
'footer':'footer'
}
};
constructor(props, context) {
super(props, context);
new Logger('ButtonGroup');
this.state = {
activeIndex:this.props.index
}
this.clickable = props.clickable
if(['default','footer'].indexOf(props.phType)!=-1) this.clickable = false
}
componentWillReceiveProps(nextProps){
if(this.state.activeIndex != nextProps.index) this.setState({activeIndex: nextProps.index});
}
clickHandler(index){
let {phType, clickCallback} = this.props
if(!this.clickable) return;
clickCallback && clickCallback(index)
this.setState({
activeIndex: index
})
}
renderChildren(){
let {phType, children} = this.props
return React.Children.map(children,(child,index)=>{
let options = {}
options.clickCallback = this.clickHandler.bind(this,index)
if(this.clickable){
options.hollow = this.state.activeIndex !== index
}
let newChildren = React.cloneElement(child, options)
return newChildren
}, this)
}
renderExtra(extra){
return <div className={this.setPhPrefix('text')}>{extra}</div>
}
renderButtonGroup(){
const {componentTag:Component, children, className, extra} = this.props;
return (
<Component {...this.otherProps} className={
classnames(
this.getProperty(true),
className,
extra? this.setPhPrefix('extra'):'',
'clearfix'
)}>
{extra && this.renderExtra(extra)}
{this.renderChildren()}
</Component>
);
}
render(){
return this.renderButtonGroup()
}
}