UNPKG

6.7 kBJavaScriptView Raw
1'use strict';
2
3exports.__esModule = true;
4
5var _extends3 = require('babel-runtime/helpers/extends');
6
7var _extends4 = _interopRequireDefault(_extends3);
8
9var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties');
10
11var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
12
13var _from = require('babel-runtime/core-js/array/from');
14
15var _from2 = _interopRequireDefault(_from);
16
17var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
18
19var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
20
21var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
22
23var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
24
25var _inherits2 = require('babel-runtime/helpers/inherits');
26
27var _inherits3 = _interopRequireDefault(_inherits2);
28
29var _classnames = require('classnames');
30
31var _classnames2 = _interopRequireDefault(_classnames);
32
33var _keycode = require('keycode');
34
35var _keycode2 = _interopRequireDefault(_keycode);
36
37var _react = require('react');
38
39var _react2 = _interopRequireDefault(_react);
40
41var _propTypes = require('prop-types');
42
43var _propTypes2 = _interopRequireDefault(_propTypes);
44
45var _reactDom = require('react-dom');
46
47var _reactDom2 = _interopRequireDefault(_reactDom);
48
49var _RootCloseWrapper = require('react-overlays/lib/RootCloseWrapper');
50
51var _RootCloseWrapper2 = _interopRequireDefault(_RootCloseWrapper);
52
53var _bootstrapUtils = require('./utils/bootstrapUtils');
54
55var _createChainedFunction = require('./utils/createChainedFunction');
56
57var _createChainedFunction2 = _interopRequireDefault(_createChainedFunction);
58
59var _ValidComponentChildren = require('./utils/ValidComponentChildren');
60
61var _ValidComponentChildren2 = _interopRequireDefault(_ValidComponentChildren);
62
63function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
64
65var propTypes = {
66 open: _propTypes2.default.bool,
67 pullRight: _propTypes2.default.bool,
68 onClose: _propTypes2.default.func,
69 labelledBy: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number]),
70 onSelect: _propTypes2.default.func,
71 rootCloseEvent: _propTypes2.default.oneOf(['click', 'mousedown'])
72};
73
74var defaultProps = {
75 bsRole: 'menu',
76 pullRight: false
77};
78
79var DropdownMenu = function (_React$Component) {
80 (0, _inherits3.default)(DropdownMenu, _React$Component);
81
82 function DropdownMenu(props) {
83 (0, _classCallCheck3.default)(this, DropdownMenu);
84
85 var _this = (0, _possibleConstructorReturn3.default)(this, _React$Component.call(this, props));
86
87 _this.handleRootClose = _this.handleRootClose.bind(_this);
88 _this.handleKeyDown = _this.handleKeyDown.bind(_this);
89 return _this;
90 }
91
92 DropdownMenu.prototype.getFocusableMenuItems = function getFocusableMenuItems() {
93 var node = _reactDom2.default.findDOMNode(this);
94 if (!node) {
95 return [];
96 }
97
98 return (0, _from2.default)(node.querySelectorAll('[tabIndex="-1"]'));
99 };
100
101 DropdownMenu.prototype.getItemsAndActiveIndex = function getItemsAndActiveIndex() {
102 var items = this.getFocusableMenuItems();
103 var activeIndex = items.indexOf(document.activeElement);
104
105 return { items: items, activeIndex: activeIndex };
106 };
107
108 DropdownMenu.prototype.focusNext = function focusNext() {
109 var _getItemsAndActiveInd = this.getItemsAndActiveIndex(),
110 items = _getItemsAndActiveInd.items,
111 activeIndex = _getItemsAndActiveInd.activeIndex;
112
113 if (items.length === 0) {
114 return;
115 }
116
117 var nextIndex = activeIndex === items.length - 1 ? 0 : activeIndex + 1;
118 items[nextIndex].focus();
119 };
120
121 DropdownMenu.prototype.focusPrevious = function focusPrevious() {
122 var _getItemsAndActiveInd2 = this.getItemsAndActiveIndex(),
123 items = _getItemsAndActiveInd2.items,
124 activeIndex = _getItemsAndActiveInd2.activeIndex;
125
126 if (items.length === 0) {
127 return;
128 }
129
130 var prevIndex = activeIndex === 0 ? items.length - 1 : activeIndex - 1;
131 items[prevIndex].focus();
132 };
133
134 DropdownMenu.prototype.handleKeyDown = function handleKeyDown(event) {
135 switch (event.keyCode) {
136 case _keycode2.default.codes.down:
137 this.focusNext();
138 event.preventDefault();
139 break;
140 case _keycode2.default.codes.up:
141 this.focusPrevious();
142 event.preventDefault();
143 break;
144 case _keycode2.default.codes.esc:
145 case _keycode2.default.codes.tab:
146 this.props.onClose(event, { source: 'keydown' });
147 break;
148 default:
149 }
150 };
151
152 DropdownMenu.prototype.handleRootClose = function handleRootClose(event) {
153 this.props.onClose(event, { source: 'rootClose' });
154 };
155
156 DropdownMenu.prototype.render = function render() {
157 var _extends2,
158 _this2 = this;
159
160 var _props = this.props,
161 open = _props.open,
162 pullRight = _props.pullRight,
163 labelledBy = _props.labelledBy,
164 onSelect = _props.onSelect,
165 className = _props.className,
166 rootCloseEvent = _props.rootCloseEvent,
167 children = _props.children,
168 props = (0, _objectWithoutProperties3.default)(_props, ['open', 'pullRight', 'labelledBy', 'onSelect', 'className', 'rootCloseEvent', 'children']);
169
170 var _splitBsPropsAndOmit = (0, _bootstrapUtils.splitBsPropsAndOmit)(props, ['onClose']),
171 bsProps = _splitBsPropsAndOmit[0],
172 elementProps = _splitBsPropsAndOmit[1];
173
174 var classes = (0, _extends4.default)({}, (0, _bootstrapUtils.getClassSet)(bsProps), (_extends2 = {}, _extends2[(0, _bootstrapUtils.prefix)(bsProps, 'right')] = pullRight, _extends2));
175
176 return _react2.default.createElement(
177 _RootCloseWrapper2.default,
178 {
179 disabled: !open,
180 onRootClose: this.handleRootClose,
181 event: rootCloseEvent
182 },
183 _react2.default.createElement(
184 'ul',
185 (0, _extends4.default)({}, elementProps, {
186 role: 'menu',
187 className: (0, _classnames2.default)(className, classes),
188 'aria-labelledby': labelledBy
189 }),
190 _ValidComponentChildren2.default.map(children, function (child) {
191 return _react2.default.cloneElement(child, {
192 onKeyDown: (0, _createChainedFunction2.default)(child.props.onKeyDown, _this2.handleKeyDown),
193 onSelect: (0, _createChainedFunction2.default)(child.props.onSelect, onSelect)
194 });
195 })
196 )
197 );
198 };
199
200 return DropdownMenu;
201}(_react2.default.Component);
202
203DropdownMenu.propTypes = propTypes;
204DropdownMenu.defaultProps = defaultProps;
205
206exports.default = (0, _bootstrapUtils.bsClass)('dropdown-menu', DropdownMenu);
207module.exports = exports['default'];
\No newline at end of file