2016-09-02 04:19:37 +08:00
|
|
|
import React, { Component, PropTypes } from 'react';
|
2016-09-07 03:10:18 +08:00
|
|
|
import { findDOMNode } from 'react-dom';
|
2016-09-15 01:48:50 +08:00
|
|
|
import cx from 'classnames';
|
2016-09-07 03:10:18 +08:00
|
|
|
|
|
|
|
import KEY_CODES from '/imports/utils/keyCodes';
|
2016-09-02 04:19:37 +08:00
|
|
|
|
|
|
|
const propTypes = {
|
|
|
|
children: React.PropTypes.element.isRequired,
|
|
|
|
};
|
|
|
|
|
|
|
|
export default class DropdownTrigger extends Component {
|
|
|
|
constructor(props) {
|
|
|
|
super(props);
|
2016-09-07 03:10:18 +08:00
|
|
|
this.handleClick = this.handleClick.bind(this);
|
|
|
|
this.handleKeyDown = this.handleKeyDown.bind(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
handleClick() {
|
|
|
|
const { dropdownToggle } = this.props;
|
|
|
|
return dropdownToggle();
|
|
|
|
}
|
|
|
|
|
|
|
|
handleKeyDown(event) {
|
2016-09-15 20:27:24 +08:00
|
|
|
const { dropdownShow, dropdownHide, } = this.props;
|
2016-09-07 03:10:18 +08:00
|
|
|
|
|
|
|
if ([KEY_CODES.SPACE, KEY_CODES.ENTER].includes(event.which)) {
|
2016-09-07 22:43:54 +08:00
|
|
|
event.preventDefault();
|
|
|
|
event.stopPropagation();
|
2016-09-07 20:04:10 +08:00
|
|
|
|
2016-09-07 03:10:18 +08:00
|
|
|
return findDOMNode(this).click();
|
|
|
|
}
|
|
|
|
|
|
|
|
if ([KEY_CODES.ARROW_UP, KEY_CODES.ARROW_DOWN].includes(event.which)) {
|
|
|
|
dropdownShow();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (KEY_CODES.ESCAPE === event.which) {
|
|
|
|
dropdownHide();
|
|
|
|
}
|
|
|
|
|
2016-09-02 04:19:37 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
render() {
|
2017-05-13 02:11:42 +08:00
|
|
|
const { children, style, className, placeInTabOrder, } = this.props;
|
2016-09-02 04:19:37 +08:00
|
|
|
const TriggerComponent = React.Children.only(children);
|
|
|
|
|
2017-05-07 07:04:59 +08:00
|
|
|
let index = (placeInTabOrder) ? '0' : '-1';
|
|
|
|
|
2016-09-07 03:10:18 +08:00
|
|
|
const TriggerComponentBounded = React.cloneElement(children, {
|
|
|
|
onClick: this.handleClick,
|
|
|
|
onKeyDown: this.handleKeyDown,
|
2016-09-02 04:19:37 +08:00
|
|
|
'aria-haspopup': true,
|
2017-05-07 07:04:59 +08:00
|
|
|
tabIndex: index,
|
2016-09-15 01:48:50 +08:00
|
|
|
style: style,
|
|
|
|
className: cx(children.props.className, className),
|
2016-09-02 04:19:37 +08:00
|
|
|
});
|
|
|
|
|
|
|
|
return TriggerComponentBounded;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
DropdownTrigger.propTypes = propTypes;
|