UNPKG

4.37 kBJavaScriptView Raw
1'use strict';
2
3exports.__esModule = true;
4
5var _extends2 = require('babel-runtime/helpers/extends');
6
7var _extends3 = _interopRequireDefault(_extends2);
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 _react = require('react');
26
27var _react2 = _interopRequireDefault(_react);
28
29var _propTypes = require('prop-types');
30
31var _propTypes2 = _interopRequireDefault(_propTypes);
32
33var _elementType = require('prop-types-extra/lib/elementType');
34
35var _elementType2 = _interopRequireDefault(_elementType);
36
37var _createChainedFunction = require('./utils/createChainedFunction');
38
39var _createChainedFunction2 = _interopRequireDefault(_createChainedFunction);
40
41function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
42
43var propTypes = {
44 href: _propTypes2.default.string,
45 onClick: _propTypes2.default.func,
46 onKeyDown: _propTypes2.default.func,
47 disabled: _propTypes2.default.bool,
48 role: _propTypes2.default.string,
49 tabIndex: _propTypes2.default.oneOfType([_propTypes2.default.number, _propTypes2.default.string]),
50 /**
51 * this is sort of silly but needed for Button
52 */
53 componentClass: _elementType2.default
54};
55
56var defaultProps = {
57 componentClass: 'a'
58};
59
60function isTrivialHref(href) {
61 return !href || href.trim() === '#';
62}
63
64/**
65 * There are situations due to browser quirks or Bootstrap CSS where
66 * an anchor tag is needed, when semantically a button tag is the
67 * better choice. SafeAnchor ensures that when an anchor is used like a
68 * button its accessible. It also emulates input `disabled` behavior for
69 * links, which is usually desirable for Buttons, NavItems, MenuItems, etc.
70 */
71
72var SafeAnchor = function (_React$Component) {
73 (0, _inherits3.default)(SafeAnchor, _React$Component);
74
75 function SafeAnchor(props, context) {
76 (0, _classCallCheck3.default)(this, SafeAnchor);
77
78 var _this = (0, _possibleConstructorReturn3.default)(this, _React$Component.call(this, props, context));
79
80 _this.handleClick = _this.handleClick.bind(_this);
81 _this.handleKeyDown = _this.handleKeyDown.bind(_this);
82 return _this;
83 }
84
85 SafeAnchor.prototype.handleClick = function handleClick(event) {
86 var _props = this.props,
87 disabled = _props.disabled,
88 href = _props.href,
89 onClick = _props.onClick;
90
91
92 if (disabled || isTrivialHref(href)) {
93 event.preventDefault();
94 }
95
96 if (disabled) {
97 event.stopPropagation();
98 return;
99 }
100
101 if (onClick) {
102 onClick(event);
103 }
104 };
105
106 SafeAnchor.prototype.handleKeyDown = function handleKeyDown(event) {
107 if (event.key === ' ') {
108 event.preventDefault();
109 this.handleClick(event);
110 }
111 };
112
113 SafeAnchor.prototype.render = function render() {
114 var _props2 = this.props,
115 Component = _props2.componentClass,
116 disabled = _props2.disabled,
117 onKeyDown = _props2.onKeyDown,
118 props = (0, _objectWithoutProperties3.default)(_props2, ['componentClass', 'disabled', 'onKeyDown']);
119
120
121 if (isTrivialHref(props.href)) {
122 props.role = props.role || 'button';
123 // we want to make sure there is a href attribute on the node
124 // otherwise, the cursor incorrectly styled (except with role='button')
125 props.href = props.href || '#';
126 }
127
128 if (disabled) {
129 props.tabIndex = -1;
130 props.style = (0, _extends3.default)({ pointerEvents: 'none' }, props.style);
131 }
132
133 return _react2.default.createElement(Component, (0, _extends3.default)({}, props, {
134 onClick: this.handleClick,
135 onKeyDown: (0, _createChainedFunction2.default)(this.handleKeyDown, onKeyDown)
136 }));
137 };
138
139 return SafeAnchor;
140}(_react2.default.Component);
141
142SafeAnchor.propTypes = propTypes;
143SafeAnchor.defaultProps = defaultProps;
144
145exports.default = SafeAnchor;
146module.exports = exports['default'];
\No newline at end of file