cpui-components
Version:
143 lines (118 loc) • 5.22 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Dropdown = undefined;
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
var _Transition = require('react-transition-group/Transition');
var _Transition2 = _interopRequireDefault(_Transition);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var Dropdown = exports.Dropdown = function (_Component) {
_inherits(Dropdown, _Component);
function Dropdown(props) {
_classCallCheck(this, Dropdown);
var _this = _possibleConstructorReturn(this, (Dropdown.__proto__ || Object.getPrototypeOf(Dropdown)).call(this, props));
_this.handleOpen = function (openEvent) {
_this.setState({ isOpen: !_this.state.isOpen });
};
_this.handleSelection = function (selectionEvent) {
_this.setState({
dropdownLabel: selectionEvent.target.getAttribute('data-label'),
isOpen: false,
selectedOption: selectionEvent.target.value
}, _this.props.onChange(selectionEvent));
};
_this.render = function () {
var id = _this.props.id;
var _this$state = _this.state,
isOpen = _this$state.isOpen,
dropdownLabel = _this$state.dropdownLabel;
return _react2.default.createElement(
'div',
{ id: id,
tabIndex: '0',
className: 'cp-DropdownMenu ' + (isOpen ? 'is-open' : '') + ' ' + (_this.props.size == 'small' ? 'cp-DropdownMenu--small' : '') + ' ' + (_this.props.slim ? 'cp-DropdownMenu--slim' : ''),
'data-label': dropdownLabel,
onClick: _this.handleOpen },
_react2.default.createElement(
'svg',
{ className: 'cp-DropdownMenu-arrow--down' },
_react2.default.createElement('use', { xmlnsXlink: 'http://www.w3.org/1999/xlink', xlinkHref: '#iconArrow--down' })
),
_this.renderMenu(_this.handleSelection)
);
};
_this.renderMenu = function (handleSelection) {
var _this$props = _this.props,
id = _this$props.id,
options = _this$props.options,
transitionTimeout = _this$props.transitionTimeout;
var _this$state2 = _this.state,
selectedOption = _this$state2.selectedOption,
isOpen = _this$state2.isOpen;
var transitionProps = { in: isOpen, timeout: transitionTimeout };
var optionDivs = options.map(function (optionName, index) {
var optionId = id + 'Option' + index;
return _react2.default.createElement(
'div',
{ key: index },
_react2.default.createElement('input', { id: optionId,
value: optionId,
name: id + 'Options',
'data-label': optionName,
type: 'radio',
className: 'cp-RadioButton-input',
checked: selectedOption === optionId,
onChange: handleSelection }),
_react2.default.createElement(
'label',
{ htmlFor: optionId,
className: 'cp-RadioButton-label cp-DropdownMenu-option' },
optionName
)
);
});
return _react2.default.createElement(
_Transition2.default,
transitionProps,
function (state) {
return _react2.default.createElement(
'div',
{ className: 'cp-DropdownMenu-menu Dropdown-fade-' + state },
optionDivs
);
}
);
};
_this.state = {
dropdownLabel: _this.props.startValue,
isOpen: false,
selectedOption: _this.props.selectedOption != null ? _this.props.id + 'Option' + _this.props.selectedOption : _this.props.startValue != null ? _this.props.id + 'Option' + _this.props.options.findIndex(function (option) {
return option.toString() === _this.props.startValue;
}) : ''
};
return _this;
}
return Dropdown;
}(_react.Component);
Dropdown.propTypes = {
startValue: _propTypes2.default.string,
id: _propTypes2.default.string.isRequired,
onChange: _propTypes2.default.func,
options: _propTypes2.default.array.isRequired,
size: _propTypes2.default.oneOf(['small']),
slim: _propTypes2.default.bool,
transitionTimeout: _propTypes2.default.oneOfType([_propTypes2.default.shape({ enter: _propTypes2.default.number, exit: _propTypes2.default.number }), _propTypes2.default.number])
};
Dropdown.defaultProps = {
startValue: 'Select an option',
transitionTimeout: 240,
onChange: function onChange(e) {}
};
exports.default = Dropdown;