UNPKG

5.41 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 _propTypes = require('prop-types');
26
27var _propTypes2 = _interopRequireDefault(_propTypes);
28
29var _react = require('react');
30
31var _react2 = _interopRequireDefault(_react);
32
33var _invariant = require('invariant');
34
35var _invariant2 = _interopRequireDefault(_invariant);
36
37var _uncontrollable = require('uncontrollable');
38
39var _uncontrollable2 = _interopRequireDefault(_uncontrollable);
40
41var _createChainedFunction = require('./utils/createChainedFunction');
42
43var _createChainedFunction2 = _interopRequireDefault(_createChainedFunction);
44
45var _ValidComponentChildren = require('./utils/ValidComponentChildren');
46
47var _ValidComponentChildren2 = _interopRequireDefault(_ValidComponentChildren);
48
49var _ButtonGroup = require('./ButtonGroup');
50
51var _ButtonGroup2 = _interopRequireDefault(_ButtonGroup);
52
53var _ToggleButton = require('./ToggleButton');
54
55var _ToggleButton2 = _interopRequireDefault(_ToggleButton);
56
57function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
58
59var propTypes = {
60 /**
61 * An HTML `<input>` name for each child button.
62 *
63 * __Required if `type` is set to `'radio'`__
64 */
65 name: _propTypes2.default.string,
66
67 /**
68 * The value, or array of values, of the active (pressed) buttons
69 *
70 * @controllable onChange
71 */
72 value: _propTypes2.default.any,
73
74 /**
75 * Callback fired when a button is pressed, depending on whether the `type`
76 * is `'radio'` or `'checkbox'`, `onChange` will be called with the value or
77 * array of active values
78 *
79 * @controllable values
80 */
81 onChange: _propTypes2.default.func,
82
83 /**
84 * The input `type` of the rendered buttons, determines the toggle behavior
85 * of the buttons
86 */
87 type: _propTypes2.default.oneOf(['checkbox', 'radio']).isRequired
88};
89
90var defaultProps = {
91 type: 'radio'
92};
93
94var ToggleButtonGroup = function (_React$Component) {
95 (0, _inherits3.default)(ToggleButtonGroup, _React$Component);
96
97 function ToggleButtonGroup() {
98 (0, _classCallCheck3.default)(this, ToggleButtonGroup);
99 return (0, _possibleConstructorReturn3.default)(this, _React$Component.apply(this, arguments));
100 }
101
102 ToggleButtonGroup.prototype.getValues = function getValues() {
103 var value = this.props.value;
104
105 return value == null ? [] : [].concat(value);
106 };
107
108 ToggleButtonGroup.prototype.handleToggle = function handleToggle(value) {
109 var _props = this.props,
110 type = _props.type,
111 onChange = _props.onChange;
112
113 var values = this.getValues();
114 var isActive = values.indexOf(value) !== -1;
115
116 if (type === 'radio') {
117 if (!isActive) {
118 onChange(value);
119 }
120 return;
121 }
122
123 if (isActive) {
124 onChange(values.filter(function (n) {
125 return n !== value;
126 }));
127 } else {
128 onChange([].concat(values, [value]));
129 }
130 };
131
132 ToggleButtonGroup.prototype.render = function render() {
133 var _this2 = this;
134
135 var _props2 = this.props,
136 children = _props2.children,
137 type = _props2.type,
138 name = _props2.name,
139 props = (0, _objectWithoutProperties3.default)(_props2, ['children', 'type', 'name']);
140
141
142 var values = this.getValues();
143
144 !(type !== 'radio' || !!name) ? process.env.NODE_ENV !== 'production' ? (0, _invariant2.default)(false, 'A `name` is required to group the toggle buttons when the `type` ' + 'is set to "radio"') : (0, _invariant2.default)(false) : void 0;
145
146 delete props.onChange;
147 delete props.value;
148
149 // the data attribute is required b/c twbs css uses it in the selector
150 return _react2.default.createElement(
151 _ButtonGroup2.default,
152 (0, _extends3.default)({}, props, { 'data-toggle': 'buttons' }),
153 _ValidComponentChildren2.default.map(children, function (child) {
154 var _child$props = child.props,
155 value = _child$props.value,
156 onChange = _child$props.onChange;
157
158 var handler = function handler() {
159 return _this2.handleToggle(value);
160 };
161
162 return _react2.default.cloneElement(child, {
163 type: type,
164 name: child.name || name,
165 checked: values.indexOf(value) !== -1,
166 onChange: (0, _createChainedFunction2.default)(onChange, handler)
167 });
168 })
169 );
170 };
171
172 return ToggleButtonGroup;
173}(_react2.default.Component);
174
175ToggleButtonGroup.propTypes = propTypes;
176ToggleButtonGroup.defaultProps = defaultProps;
177
178var UncontrolledToggleButtonGroup = (0, _uncontrollable2.default)(ToggleButtonGroup, {
179 value: 'onChange'
180});
181
182UncontrolledToggleButtonGroup.Button = _ToggleButton2.default;
183
184exports.default = UncontrolledToggleButtonGroup;
185module.exports = exports['default'];
\No newline at end of file