2016-05-20 21:37:19 +08:00
|
|
|
import React, { Component, PropTypes } from 'react';
|
|
|
|
|
|
|
|
const propTypes = {
|
|
|
|
/**
|
|
|
|
* Defines HTML disable Attribute
|
|
|
|
* @defaultValue false
|
|
|
|
*/
|
|
|
|
disabled: PropTypes.bool,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Defines HTML Tag
|
|
|
|
* @defaultValue 'button'
|
|
|
|
*/
|
|
|
|
tagName: PropTypes.string,
|
|
|
|
|
2016-06-18 00:42:17 +08:00
|
|
|
/**
|
|
|
|
* Defines the button label
|
|
|
|
* @defaultValue undefined
|
|
|
|
*/
|
|
|
|
label: PropTypes.string.isRequired,
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Defines the button click handler
|
|
|
|
* @defaultValue undefined
|
|
|
|
*/
|
2016-05-20 21:37:19 +08:00
|
|
|
onClick: PropTypes.func.isRequired,
|
|
|
|
};
|
|
|
|
|
|
|
|
const defaultProps = {
|
|
|
|
disabled: false,
|
|
|
|
tagName: 'button',
|
2016-06-18 00:42:17 +08:00
|
|
|
role: 'button',
|
2016-05-20 21:37:19 +08:00
|
|
|
};
|
|
|
|
|
2016-08-06 02:39:24 +08:00
|
|
|
/**
|
|
|
|
* Event handlers below are used to intercept a parent event handler from
|
|
|
|
* firing when the Button is disabled.
|
|
|
|
* Key press event handlers intercept firing for
|
|
|
|
* keyboard users to comply with ARIA standards.
|
|
|
|
*/
|
|
|
|
|
2016-05-20 21:37:19 +08:00
|
|
|
export default class ButtonBase extends Component {
|
|
|
|
constructor(props) {
|
|
|
|
super(props);
|
2016-08-03 06:55:20 +08:00
|
|
|
|
|
|
|
// Bind Mouse Event Handlers
|
|
|
|
this.internalClickHandler = this.internalClickHandler.bind(this);
|
|
|
|
this.internalDoubleClickHandler = this.internalDoubleClickHandler.bind(this);
|
|
|
|
this.internalMouseDownHandler = this.internalMouseDownHandler.bind(this);
|
|
|
|
this.internalMouseUpHandler = this.internalMouseUpHandler.bind(this);
|
|
|
|
|
|
|
|
// Bind Keyboard Event Handlers
|
|
|
|
this.internalKeyPressHandler = this.internalKeyPressHandler.bind(this);
|
|
|
|
this.internalKeyDownHandler = this.internalKeyDownHandler.bind(this);
|
|
|
|
this.internalKeyUpHandler = this.internalKeyUpHandler.bind(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
validateDisabled(eventHandler, args) {
|
|
|
|
if (!this.props.disabled && typeof eventHandler === 'function') {
|
|
|
|
return eventHandler(...args);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Define Mouse Event Handlers
|
|
|
|
internalClickHandler(event) {
|
|
|
|
return this.validateDisabled(this.props.onClick, ...arguments);
|
|
|
|
}
|
|
|
|
|
|
|
|
internalDoubleClickHandler(event) {
|
|
|
|
return this.validateDisabled(this.props.onDoubleClick, ...arguments);
|
|
|
|
}
|
|
|
|
|
|
|
|
internalMouseDownHandler(event) {
|
|
|
|
return this.validateDisabled(this.props.onMouseDown, ...arguments);
|
|
|
|
}
|
|
|
|
|
|
|
|
internalMouseUpHandler() {
|
|
|
|
return this.validateDisabled(this.props.onMouseUp, ...arguments);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Define Keyboard Event Handlers
|
|
|
|
internalKeyPressHandler() {
|
|
|
|
return this.validateDisabled(this.props.onKeyPress, ...arguments);
|
|
|
|
}
|
|
|
|
|
|
|
|
internalKeyDownHandler() {
|
|
|
|
return this.validateDisabled(this.props.onKeyDown, ...arguments);
|
|
|
|
}
|
|
|
|
|
|
|
|
internalKeyUpHandler() {
|
|
|
|
return this.validateDisabled(this.props.onKeyUp, ...arguments);
|
2016-05-20 21:37:19 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
render() {
|
|
|
|
let Component = this.props.tagName;
|
|
|
|
|
2016-07-12 04:10:55 +08:00
|
|
|
const remainingProps = Object.assign({}, this.props);
|
|
|
|
delete remainingProps.label;
|
|
|
|
delete remainingProps.tagName;
|
2016-08-03 06:55:20 +08:00
|
|
|
delete remainingProps.disabled;
|
|
|
|
|
|
|
|
// Delete Mouse event handlers
|
|
|
|
delete remainingProps.onClick;
|
|
|
|
delete remainingProps.onDoubleClick;
|
|
|
|
delete remainingProps.onMouseDown;
|
|
|
|
delete remainingProps.onMouseUp;
|
|
|
|
|
|
|
|
// Delete Keyboard event handlers
|
|
|
|
delete remainingProps.onKeyPress;
|
|
|
|
delete remainingProps.onKeyDown;
|
|
|
|
delete remainingProps.onKeyUp;
|
2016-07-12 04:10:55 +08:00
|
|
|
|
2016-05-20 21:37:19 +08:00
|
|
|
return (
|
2016-08-03 06:55:20 +08:00
|
|
|
<Component
|
|
|
|
aria-label={this.props.label}
|
|
|
|
aria-disabled={this.props.disabled}
|
|
|
|
|
|
|
|
// Render Mouse event handlers
|
|
|
|
onClick={this.internalClickHandler}
|
|
|
|
onDoubleClick={this.internalDoubleClickHandler}
|
|
|
|
onMouseDown={this.internalMouseDownHandler}
|
|
|
|
onMouseUp={this.internalMouseUpHandler}
|
|
|
|
|
|
|
|
// Render Keyboard event handlers
|
|
|
|
onKeyPress={this.internalKeyPressHandler}
|
|
|
|
onKeyDown={this.internalKeyDownHandler}
|
|
|
|
onKeyUp={this.internalKeyUpHandler}
|
|
|
|
|
|
|
|
{...remainingProps}
|
|
|
|
>
|
2016-05-20 21:37:19 +08:00
|
|
|
{this.props.children}
|
|
|
|
</Component>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
ButtonBase.propTypes = propTypes;
|
|
|
|
ButtonBase.defaultProps = defaultProps;
|