UNPKG

10.6 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 _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
14
15var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
16
17var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
18
19var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
20
21var _inherits2 = require('babel-runtime/helpers/inherits');
22
23var _inherits3 = _interopRequireDefault(_inherits2);
24
25var _classnames = require('classnames');
26
27var _classnames2 = _interopRequireDefault(_classnames);
28
29var _react = require('react');
30
31var _react2 = _interopRequireDefault(_react);
32
33var _propTypes = require('prop-types');
34
35var _propTypes2 = _interopRequireDefault(_propTypes);
36
37var _elementType = require('prop-types-extra/lib/elementType');
38
39var _elementType2 = _interopRequireDefault(_elementType);
40
41var _uncontrollable = require('uncontrollable');
42
43var _uncontrollable2 = _interopRequireDefault(_uncontrollable);
44
45var _Grid = require('./Grid');
46
47var _Grid2 = _interopRequireDefault(_Grid);
48
49var _NavbarBrand = require('./NavbarBrand');
50
51var _NavbarBrand2 = _interopRequireDefault(_NavbarBrand);
52
53var _NavbarCollapse = require('./NavbarCollapse');
54
55var _NavbarCollapse2 = _interopRequireDefault(_NavbarCollapse);
56
57var _NavbarHeader = require('./NavbarHeader');
58
59var _NavbarHeader2 = _interopRequireDefault(_NavbarHeader);
60
61var _NavbarToggle = require('./NavbarToggle');
62
63var _NavbarToggle2 = _interopRequireDefault(_NavbarToggle);
64
65var _bootstrapUtils = require('./utils/bootstrapUtils');
66
67var _StyleConfig = require('./utils/StyleConfig');
68
69var _createChainedFunction = require('./utils/createChainedFunction');
70
71var _createChainedFunction2 = _interopRequireDefault(_createChainedFunction);
72
73function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
74
75var propTypes = {
76 /**
77 * Create a fixed navbar along the top of the screen, that scrolls with the
78 * page
79 */
80 fixedTop: _propTypes2.default.bool,
81 /**
82 * Create a fixed navbar along the bottom of the screen, that scrolls with
83 * the page
84 */
85 fixedBottom: _propTypes2.default.bool,
86 /**
87 * Create a full-width navbar that scrolls away with the page
88 */
89 staticTop: _propTypes2.default.bool,
90 /**
91 * An alternative dark visual style for the Navbar
92 */
93 inverse: _propTypes2.default.bool,
94 /**
95 * Allow the Navbar to fluidly adjust to the page or container width, instead
96 * of at the predefined screen breakpoints
97 */
98 fluid: _propTypes2.default.bool,
99
100 /**
101 * Set a custom element for this component.
102 */
103 componentClass: _elementType2.default,
104 /**
105 * A callback fired when the `<Navbar>` body collapses or expands. Fired when
106 * a `<Navbar.Toggle>` is clicked and called with the new `expanded`
107 * boolean value.
108 *
109 * @controllable expanded
110 */
111 onToggle: _propTypes2.default.func,
112 /**
113 * A callback fired when a descendant of a child `<Nav>` is selected. Should
114 * be used to execute complex closing or other miscellaneous actions desired
115 * after selecting a descendant of `<Nav>`. Does nothing if no `<Nav>` or `<Nav>`
116 * descendants exist. The callback is called with an eventKey, which is a
117 * prop from the selected `<Nav>` descendant, and an event.
118 *
119 * ```js
120 * function (
121 * Any eventKey,
122 * SyntheticEvent event?
123 * )
124 * ```
125 *
126 * For basic closing behavior after all `<Nav>` descendant onSelect events in
127 * mobile viewports, try using collapseOnSelect.
128 *
129 * Note: If you are manually closing the navbar using this `OnSelect` prop,
130 * ensure that you are setting `expanded` to false and not *toggling* between
131 * true and false.
132 */
133 onSelect: _propTypes2.default.func,
134 /**
135 * Sets `expanded` to `false` after the onSelect event of a descendant of a
136 * child `<Nav>`. Does nothing if no `<Nav>` or `<Nav>` descendants exist.
137 *
138 * The onSelect callback should be used instead for more complex operations
139 * that need to be executed after the `select` event of `<Nav>` descendants.
140 */
141 collapseOnSelect: _propTypes2.default.bool,
142 /**
143 * Explicitly set the visiblity of the navbar body
144 *
145 * @controllable onToggle
146 */
147 expanded: _propTypes2.default.bool,
148
149 role: _propTypes2.default.string
150}; // TODO: Remove this pragma once we upgrade eslint-config-airbnb.
151/* eslint-disable react/no-multi-comp */
152
153var defaultProps = {
154 componentClass: 'nav',
155 fixedTop: false,
156 fixedBottom: false,
157 staticTop: false,
158 inverse: false,
159 fluid: false,
160 collapseOnSelect: false
161};
162
163var childContextTypes = {
164 $bs_navbar: _propTypes2.default.shape({
165 bsClass: _propTypes2.default.string,
166 expanded: _propTypes2.default.bool,
167 onToggle: _propTypes2.default.func.isRequired,
168 onSelect: _propTypes2.default.func
169 })
170};
171
172var Navbar = function (_React$Component) {
173 (0, _inherits3.default)(Navbar, _React$Component);
174
175 function Navbar(props, context) {
176 (0, _classCallCheck3.default)(this, Navbar);
177
178 var _this = (0, _possibleConstructorReturn3.default)(this, _React$Component.call(this, props, context));
179
180 _this.handleToggle = _this.handleToggle.bind(_this);
181 _this.handleCollapse = _this.handleCollapse.bind(_this);
182 return _this;
183 }
184
185 Navbar.prototype.getChildContext = function getChildContext() {
186 var _props = this.props,
187 bsClass = _props.bsClass,
188 expanded = _props.expanded,
189 onSelect = _props.onSelect,
190 collapseOnSelect = _props.collapseOnSelect;
191
192
193 return {
194 $bs_navbar: {
195 bsClass: bsClass,
196 expanded: expanded,
197 onToggle: this.handleToggle,
198 onSelect: (0, _createChainedFunction2.default)(onSelect, collapseOnSelect ? this.handleCollapse : null)
199 }
200 };
201 };
202
203 Navbar.prototype.handleCollapse = function handleCollapse() {
204 var _props2 = this.props,
205 onToggle = _props2.onToggle,
206 expanded = _props2.expanded;
207
208
209 if (expanded) {
210 onToggle(false);
211 }
212 };
213
214 Navbar.prototype.handleToggle = function handleToggle() {
215 var _props3 = this.props,
216 onToggle = _props3.onToggle,
217 expanded = _props3.expanded;
218
219
220 onToggle(!expanded);
221 };
222
223 Navbar.prototype.render = function render() {
224 var _extends2;
225
226 var _props4 = this.props,
227 Component = _props4.componentClass,
228 fixedTop = _props4.fixedTop,
229 fixedBottom = _props4.fixedBottom,
230 staticTop = _props4.staticTop,
231 inverse = _props4.inverse,
232 fluid = _props4.fluid,
233 className = _props4.className,
234 children = _props4.children,
235 props = (0, _objectWithoutProperties3.default)(_props4, ['componentClass', 'fixedTop', 'fixedBottom', 'staticTop', 'inverse', 'fluid', 'className', 'children']);
236
237 var _splitBsPropsAndOmit = (0, _bootstrapUtils.splitBsPropsAndOmit)(props, ['expanded', 'onToggle', 'onSelect', 'collapseOnSelect']),
238 bsProps = _splitBsPropsAndOmit[0],
239 elementProps = _splitBsPropsAndOmit[1];
240
241 // will result in some false positives but that seems better
242 // than false negatives. strict `undefined` check allows explicit
243 // "nulling" of the role if the user really doesn't want one
244
245
246 if (elementProps.role === undefined && Component !== 'nav') {
247 elementProps.role = 'navigation';
248 }
249
250 if (inverse) {
251 bsProps.bsStyle = _StyleConfig.Style.INVERSE;
252 }
253
254 var classes = (0, _extends4.default)({}, (0, _bootstrapUtils.getClassSet)(bsProps), (_extends2 = {}, _extends2[(0, _bootstrapUtils.prefix)(bsProps, 'fixed-top')] = fixedTop, _extends2[(0, _bootstrapUtils.prefix)(bsProps, 'fixed-bottom')] = fixedBottom, _extends2[(0, _bootstrapUtils.prefix)(bsProps, 'static-top')] = staticTop, _extends2));
255
256 return _react2.default.createElement(
257 Component,
258 (0, _extends4.default)({}, elementProps, { className: (0, _classnames2.default)(className, classes) }),
259 _react2.default.createElement(
260 _Grid2.default,
261 { fluid: fluid },
262 children
263 )
264 );
265 };
266
267 return Navbar;
268}(_react2.default.Component);
269
270Navbar.propTypes = propTypes;
271Navbar.defaultProps = defaultProps;
272Navbar.childContextTypes = childContextTypes;
273
274(0, _bootstrapUtils.bsClass)('navbar', Navbar);
275
276var UncontrollableNavbar = (0, _uncontrollable2.default)(Navbar, { expanded: 'onToggle' });
277
278function createSimpleWrapper(tag, suffix, displayName) {
279 var Wrapper = function Wrapper(_ref, _ref2) {
280 var _ref2$$bs_navbar = _ref2.$bs_navbar,
281 navbarProps = _ref2$$bs_navbar === undefined ? { bsClass: 'navbar' } : _ref2$$bs_navbar;
282 var Component = _ref.componentClass,
283 className = _ref.className,
284 pullRight = _ref.pullRight,
285 pullLeft = _ref.pullLeft,
286 props = (0, _objectWithoutProperties3.default)(_ref, ['componentClass', 'className', 'pullRight', 'pullLeft']);
287 return _react2.default.createElement(Component, (0, _extends4.default)({}, props, {
288 className: (0, _classnames2.default)(className, (0, _bootstrapUtils.prefix)(navbarProps, suffix), pullRight && (0, _bootstrapUtils.prefix)(navbarProps, 'right'), pullLeft && (0, _bootstrapUtils.prefix)(navbarProps, 'left'))
289 }));
290 };
291
292 Wrapper.displayName = displayName;
293
294 Wrapper.propTypes = {
295 componentClass: _elementType2.default,
296 pullRight: _propTypes2.default.bool,
297 pullLeft: _propTypes2.default.bool
298 };
299
300 Wrapper.defaultProps = {
301 componentClass: tag,
302 pullRight: false,
303 pullLeft: false
304 };
305
306 Wrapper.contextTypes = {
307 $bs_navbar: _propTypes2.default.shape({
308 bsClass: _propTypes2.default.string
309 })
310 };
311
312 return Wrapper;
313}
314
315UncontrollableNavbar.Brand = _NavbarBrand2.default;
316UncontrollableNavbar.Header = _NavbarHeader2.default;
317UncontrollableNavbar.Toggle = _NavbarToggle2.default;
318UncontrollableNavbar.Collapse = _NavbarCollapse2.default;
319
320UncontrollableNavbar.Form = createSimpleWrapper('div', 'form', 'NavbarForm');
321UncontrollableNavbar.Text = createSimpleWrapper('p', 'text', 'NavbarText');
322UncontrollableNavbar.Link = createSimpleWrapper('a', 'link', 'NavbarLink');
323
324// Set bsStyles here so they can be overridden.
325exports.default = (0, _bootstrapUtils.bsStyles)([_StyleConfig.Style.DEFAULT, _StyleConfig.Style.INVERSE], _StyleConfig.Style.DEFAULT, UncontrollableNavbar);
326module.exports = exports['default'];
\No newline at end of file